Shell语言用例

shell的<, <<, <<&l

2018-10-07  本文已影响3人  CodingCode

shell的<, <<, <<<操作符

我们先看一个例子

定义一个文本文件:

$ cat a.txt
AABBCC in file a.txt

使用sed命令操作文本文件:

$ cat t.sh
#!/bin/bash

sed -e "s/BB//" a.txt
sed -e "s/BB//" < a.txt
sed -e "s/BB//" << a.txt
AABBCC in inline file a.txt
a.txt
sed -e "s/BB//" <<< "AABBCC in variable"

运行结果:

$ ./t.sh
AACC in file a.txt
AACC in file a.txt
AACC in inline file a.txt
AACC in variable

分析

在t.sh里面调用了4次sed命令,每次命令的最后一个参数不一样。

  1. a.txt
    以文件a.txt作为sed的输入。

  2. < a.txt
    以stdin作为sed的输入,stdin输入的内容从a.txt里面获取。

  3. <<a.txt
    以stdin作为sed的输入,stdin输入的内容从脚本内<<a.txt和a.txt之间的inline内容获取。

  4. <<< "AABBCC in variable"
    以stdin作为sed的输入,stdin的内容就是<<<后面的字符串内容。

命令1和命令2,3,4不同之处是命令1以指定文件作为输入,而命令2,3,4以标准输入stdin作为输入内容。

至于一个命令是从标准输入stdin获取输入,还是从输入文件获取输入,还是从命令行获取输入,这是由命令工具本身决定的。我们还是以sed为例,假如sed命令同时从文件和标准输入文件stdin都提供了输入,那么sed会怎么处理呢?

$ cat a.txt
AABBCC in file a.txt
$ cat b.txt
AABBCC in file b.txt
$ sed -e "s/BB//" a.txt < b.txt
AACC in file a.txt
$ sed -e "s/BB//" b.txt < a.txt
AACC in file b.txt

看明白了吗,如果同时提供两种输入,sed使用输入文件作为输入的,这是sed命令本身的处理逻辑,大致如下:

if 有输入文件; then
   处理输入文件内容
else if 标准stdin有数据; then
   处理stdin文件内容
else
   报错啥的
fi

最后提到前面的命令2,3,4处理stdin的不同方式,这些都是调用者shell处理的,不是sed命令处理的,即sed的调用这把这些数据都分析整理好,然后丢给sed的标准输入文档stdin,然后sed就读取stdin就可以了。

结论就是

  1. "< VAR"
    VAR标识的是一个文件名,从所标识的文件读取内容,传递给命令的stdin。
  2. "<< VAR"
    VAR是一个标记,从当前脚本的inline读取内容,一直到再次遇到VAR标识符为止,传递给命令的stdin。
  3. <<< VAR
    VAR是一个变量,直接读取变量的内容,传递给命令的stdin。

具体能不能用<<<操作符,还依赖于待调用的命令本身,其是否支持从stdin读取数据。

上一篇下一篇

猜你喜欢

热点阅读