Shell输出、重定向与管道符
由于Shell脚本批处理的特殊性,其大部分操作过程位于后台,不需要用户进行干预,因此,使用重定向和管道进行执行信息的过滤和提取显得尤为重要
1、Shell输出
1.1、标准输入输出
在Shell中,交互式硬件设备标准输入(stdin
)和标准输出(stdout
)是非常重要的概念
类型 | 设备文件 | 文件描述编号/代码 | 默认设备 | 功能描述 |
---|---|---|---|---|
标准输入 | /dev/stdin |
0 | 键盘 | 从该设备接收用户输入的数据 |
标准输出 | /dev/stdout |
1 | 显示器 | 通过该设备向用户输出数据 |
标准错误输出 | /dev/stderr |
2 | 显示器 | 通过该设备报告执行出错信息 |
以下是使用Shell标准输入输出的示例:
bash
# 使用echo命令输出到stdout
echo "Hello, World!"
# 使用管道将前一个命令的stdout作为后一个命令的stdin
echo "Hello, World!" | grep "World"
cat file.txt | grep "World"
1.2、echo指令
echo
是Shell中的一个内部指令,用于将指定字符串打印输出到屏幕(标准输出)
echo
指令常用选项及说明如下:
选项 | 说明 |
---|---|
-n |
不追加换号输出(默认追加换行输出) |
-e |
启用对特殊字符的转义 |
以下是一些使用示例:
1)打印字符串文本
bash
echo "Hello, World!" # Hello, World!
2)打印变量值
bash
name="Alice"
echo "He name is $name" # He name is Alice
3)打印转义字符
bash
echo "\"Hello, World!\"" # "Hello, World!"
4)打印特殊字符
bash
# 开启转义:\n将被解释为换行,\c将被解释为不换行
echo -e "Hello \n"
echo "World"
bash
# \n输出
Hello
World
# \c输出
Hello World
5)打印命令执行结果
bash
echo `date` # Sat Aug 24 16:28:41 CST 2024
1.3、print与printf指令
print
和printf
是Shell中的两个标准格式输出指令,其中,print
是ksh
(Korn Shell)的内置命令,printf
是bash
(Bourne Again Shell)的内置命令
print
只是一个简单的打印命令,每个标准输出后自动换行;printf
则是格式化输出指令,printf
不会自动在每个标准输出后添加换行符,如果需要换行,需要手动添加\n
printf
指令的语法如下:
bash
printf fs args
fs
:格式字符串(format-string
)args
:参数列表
常用的格式字符串有:
%s
:字符串,%ns
指定输出n个字符(默认右对齐,%-ns
表示左对齐)%i
:整数,%ni
指定输出n个数字(默认右对齐)%c
:字符%d
:十进制整数%f
:浮点数%e
:科学计数法表示的浮点数%m.nf
:浮点数,共输出m位数,保留n位小数
以下是一个示例:
bash
printf %s\n 1 2 3
printf "%s 体重 %4.2f kg\n" Tom 68.6543
printf "%3s\n" 12 3
输出结果如下:
bash
123
Tom 体重 68.65 kg
12
3
2、Shell重定向
Shell(输出)重定向是指不通过标准输出到显示器上,而是输出到指定的位置(文件)。重定向一般通过在命令间插入特定的操符号来实现
类型 | 操作符 | 功能 |
---|---|---|
重定向输入 | < |
从指定文件读取数据,而非键盘输入 |
重定向输出 | > |
将输出结果保存到指定文件(覆盖原有内容) |
重定向输出(追加) | >> |
将输出结果换行追加到指定文件尾部 |
重定向错误输出 | 2> |
将错误信息保存到指定文件(覆盖原有内容) |
重定向错误输出(追加) | 2>> |
将错误信息追加到指定文件尾部 |
混合输出 | &> |
将标准输出、标准错误的内容保存到同一个文件中 |
以下是一个示例:
1)输出到文件
bash
# 如果文件存在,则覆盖内容
echo "Hello, World!" > file.txt
2)追加到文件
bash
# 追加到文件末尾
echo "Hello, World!" >> file.txt
3、Shell管道符
在Shell中,可以使用|
连接两个命令,Shell会将前后两个进程的输入输出用一个管道相连,以便达到进程间通信的目的
Shell管道符|
将前一个命令的标准输出,作为后一个命令的标准输入
以下是一个示例:
bash
cat file.txt | grep "World"