重定向
从文件输入
重定向简单说就是从文件、命令、程序、脚本或这脚本中的代码块获取输出并把它作为输入发送到另一个文件、程序、命令或脚本。每个打开的文件被指定一个描述符,比如上面的0,1,2,对于打开的另外的文件,余留了文件描述符3-9
重定向操作符只对当前命令有效,下一个命令就会重新输出到标准输出(屏幕)
while循环结合重定向输入或输出可以从文件循环读取内容或者输出内容到文件
从文本或字符串输入
除了上述重定向的方式外,还有一种重定向类型是here-documents,操作符是<<MARKER,语法格式如下:
command <<-MARKER
here document
MARKER
在这种语法中,使用一个单词作为标志,这个单词可以是任何一个,比如MARKER/END/EOF等等,但是需要选择一个不会在数据集合中出现的单词,防止冲突,在第一个标志(如<<MARKER)和第二个标志(MARKER)之间的所有行都会被作为命令的标准输入,而且第二个标志必须独占一行,比如下面将小写字母转换为大写字母的例子(例子中用haha作为标志):
[root@test ~]# tr a-z A-Z <<haha
> one two three
> four five six
> haha
ONE TWO THREE
FOUR FIVE SIX
重定向操作符<<和定界标识符(haha)之间空格可有可无,在<<后面追加减号-将会忽略行首的制表符
#!/bin/bash
tr a-z A-Z <<haha
one two three
four five six
haha
tr a-z A-Z <<-haha
one two three
four five six
haha
#执行脚本结果如下
./test.sh
ONE TWO THREE
FOUR FIVE SIX
ONE TWO THREE
FOUR FIVE SIX
默认情况下,bash替换会在here-documents部分的内容上执行,即内容中的变量和命令会被求值或者运行,要想使替换失效,可以使用单引号或者双引号括起定界符,比如下面例子:
cat <<haha
> 当前路径是:$(pwd)
> haha
当前路径是:/root
cat <<"haha"
> 当前路径是:$(pwd)
> haha
当前路径是:$(pwd)
其实这种重定向最常用的还是用作注释功能,我们再之前已经提到过了,感兴趣可以参考shell脚本注释
还有另外一种重定向方式here-strings是here-documents的一个变种,它由操作符<<<和作为标准输入的字符串构成(被shell认为是一个整体),语法如下:
command <<<WORD
单个单词不需要使用引号,如果是有空格的字符串需要用引号括起来,还可以接收多行字符串,下面是例子:
tr a-z A-Z <<< one
ONE
tr a-z A-Z <<< one two three
tr: extra operand ‘two’
Try 'tr --help' for more information.
tr a-z A-Z <<< "one two three"
ONE TWO THREE
tr a-z A-Z <<< "one two
> three four"
ONE TWO
THREE FOUR
与here-documents相比,here-strings更方便,特别是发送变量内容(而非文件)到像grep或sed这样的过滤程序时。
|