介绍
输入重定向是 < 、 <<(把内容喂给命令的标准输入 stdin)
一、< 标准输入重定向
语法:
命令 < 文件名
含义:把文件内容当作命令的标准输入,替代键盘手动输入。
例子1:cat 读取文件
# 等价 cat test.txt
cat < test.txt
cat test.txt:cat 命令直接打开文件作为参数cat < test.txt:shell 打开文件,把文件内容送入 cat 的标准输入>
效果看起来一样,但原理不同:前者是命令自己读文件;后者是shell重定向输入流。
例子2:sort 对文件内容排序
sort < names.txt
把 names.txt 的内容作为 sort 的输入进行排序输出。
例子3:mysql 导入SQL脚本(最常用场景)
mysql -uroot -p dbname < init.sql
把 init.sql 里面的SQL语句,作为mysql客户端的输入批量执行。
补充:可以组合管道+重定向
grep "error" < log.txt
二、<< Here Document(HereDoc,多行输入重定向)
<< 叫做此处文档,直接在命令行里写多行文本,作为命令的输入,不需要文件。
语法:
命令 << 分隔符
内容行1
内容行2
内容行3
分隔符
规则:
<<后面自定义结束标记符(常用EOF/END,随便起名,大小写敏感)- 中间所有行都会作为命令的标准输入
- 单独一行完全匹配分隔符(不能有空格),代表输入结束
示例1:cat 打印多行文本
cat << EOF
Hello Linux
输入重定向演示
第二行
EOF
运行后输出:
Hello Linux
输入重定向演示
第二行
示例2:写入文件(< + << 组合,非常常用)
cat << EOF > test.txt
name:zhangsan
age:20
EOF
解析:
<<EOF提供多行输入,>把cat的输出重定向写入 test.txt
示例3:变量替换(默认开启变量解析)
name="lisi"
cat << EOF
my name is $name
EOF
输出:my name is lisi
关闭变量替换:<<'EOF' 加引号
分隔符加引号,里面 $ 不再解析,原样输出:
name="lisi"
cat << 'EOF'
my name is $name
EOF
输出:my name is $name
示例4:带减号 <<-EOF(忽略行首Tab缩进)
<<- 会删除每行开头的tab(空格不会删),方便shell脚本里缩进排版
cat <<-EOF
这一行前面是Tab,输出会去掉Tab
普通行
EOF
⚠️ 只能删除Tab,空格无效;结束标记
EOF前面也可以加Tab。
三、< 和 << 对比总结
| 符号 | 名称 | 来源 | 用途 |
|---|---|---|---|
< |
输入重定向 | 文件 | 读取一个文件,作为命令stdin |
<< |
HereDoc | 内联多行文本 | 脚本里写多行内容,无需临时文件 |
<<< |
HereString | 单行字符串 | 简短单行输入 |
四、容易踩坑的注意事项
- HereDoc结束标记
EOF必须单独一行,前后不能有多余字符(<<-EOF允许前面有Tab) - 重定向是shell处理,顺序优先级:shell先处理重定向,再执行命令
<后面文件不存在直接报错;<<不需要文件- 不要混淆:
cmd > file:输出重定向(stdout→文件)cmd < file:输入重定向(文件→stdin)
五、综合练习脚本
新建 input_demo.sh
#!/bin/bash
# 1. HereDoc写入配置文件
cat << EOF > config.ini
[base]
port=8080
author=linux-test
EOF
# 2. <读取文件输入给cat
echo "====读取config.ini===="
cat < config.ini
chmod +x input_demo.sh
./input_demo.sh