命令的传递

前言:

​ Unix shell脚本最棒的特性之一就是可以轻松地将多个命令组合起来生成输出。一个命令的输出可以作为另一个命令的输入,而这个命令的输出又会传递至下一个命令,以此类推。这种命令组合的输出可以被存储在变量中。这则攻略将演示如何组合多个命令并读取其输出。

​ 命令输入通常来自于stdin或参数。输出可以发送给stdout或stderr。当我们组合多个命令时,通常将stdin用于输入,stdout用于输出。

​ 在这种情况下,这些命令被称为过滤器(filter)。我们使用管道(pipe)连接每个过滤器,管道操作符是|。(特定的一些指令才能作为过滤器:例如ls/grep/awk/sed/cat等等)例如:

$ cmd1 | cmd2 | cmd3

这里我们组合了3个命令。cmd1的输出传递给cmd2,cmd2的输出传递给cmd3,最终的输出(来自cmd3)会出现在显示器中或被导入某个文件。

示例:

组合命令:

$ ls | cat -n > out.txt

命令的值赋予给变量:

这种方法叫作子shell法。例如:

cmd_output=$(ls | cat -n)
echo $cmd_output

另一种方法叫作反引用(有些人也称它为反标记),也可以用于存储命令输出:

cmd_output=`COMMANDS`

例如:

cmd_output=`ls | cat -n`
echo $cmd_output

反引用与单引号可不是一回事,该字符位于键盘的 ~ 键上

补充内容:利用子shell生成独立的程序!(在命令当中执行子shell时不会对当前shell造成影响,当用cd命令改变子shell的当前目录时,这种变化不会反映到主shell环境中。

子shell本身就是独立的进程。可以使用()操作符来定义一个子shell!(可以用在shell脚本中)

$> pwd
/
$> (cd /bin; ls)
awk bash cat...
$> pwd
/

假设我们使用子shell或反引用的方法将命令的输出保存到变量中,为了保留输出的空格和换行符(\n),必须使用双引号。例如:

$ cat text.txt
1
2
3
$ out=$(cat text.txt)
$ echo $out
1 2 3 # 丢失了1、2、3中的\n
$ out="$(cat text.txt)"
$ echo $out
1
2
3
posted @ 2021-02-23 15:28  (◓3◒)  阅读(170)  评论(1)    收藏  举报