显示页面过去修订反向链接回到顶部 本页面只读。您可以查看源文件,但不能更改它。如果您觉得这是系统错误,请联系管理员。 # Shell Here Document ## Here Documents基本用法 Here Document是一种特殊的代码块, 通常作为一种I/O重定向的方式给命令提供输入 格式如下: ``` COMMAND <<InputComesFromHERE ... ... ... InputComesFromHERE ``` 以"<< delimiter"的形式标识多行字符串的开始,之后新起一行包含相应的文本, 最后以相同的delimiter独占一行,标识多行字符串的结束。 定界符(delimiter)可以是任意的字符串 例1: 给tr命令提供输入 ``` $ tr a-z A-Z << EOF > one two three > uno ods tres > EOF ONE TWO THREE UNO ODS TRES ``` 例2:非交互式地使用vim 模拟sed的用法,在输入文件中插入两行文本 ``` #/bin/sh # Noninteractive use of 'vi' to edit a file. # Emulates 'sed'. E_BADARGS=85 if [ -z "$1" ] then echo "Usage: `basename $0` filename" exit $E_BADARGS fi TARGETFILE=$1 # Insert 2 lines in file, then save. #--------Begin here document-----------# vim $TARGETFILE <<x23LimitStringx23 i This is line 1 of the example file. This is line 2 of the example file. ZZ x23LimitStringx23 #----------End here document-----------# # Note that ^[ above is a literal escape #+ typed by Control-V <Esc>. # Bram Moolenaar points out that this may not work with 'vim' #+ because of possible problems with terminal interaction. exit ``` 例3:非交互式地使用ex 将所有txt文件中的Smith替换为Jones ``` # Replace all instances of "Smith" with "Jones" #+ in files with a ".txt" filename suffix. ORIGINAL=Smith REPLACEMENT=Jones for file in $(fgrep -l $ORIGINAL *.txt) do # ------------------------------------- ex $file <<EOF %s/$ORIGINAL/$REPLACEMENT/g wq EOF # %s is the "ex" substitution command. # wq is write-and-quit. # ------------------------------------- done ``` 例4:使用cat输出多行信息 ``` cat <<End-of-message ------------------------------------- This is line 1 of the message. This is line 2 of the message. This is line 3 of the message. This is line 4 of the message. This is the last line of the message. ------------------------------------- End-of-message ``` 如果将`cat << End-of-message`替换为 `cat > $filename << End-of-message` 那么cat将会把输出写入文件中,而不会输出到标准输出 ## 忽略前导的tab符号 格式如下: ``` COMMAND <<-delimiter ... ... ... delimiter ``` 例: ``` #!/bin/sh cat <<-ENDOFMESSAGE This is line 1 of the message. This is line 2 of the message. This is line 3 of the message. This is line 4 of the message. This is the last line of the message. ENDOFMESSAGE exit 0 ``` delimiter以 `-` 开头, 将会去除行首的tab符号,但不包括空格符号 注意: 对非行首的tab符号无效 ## 禁止变量替换 默认情况下, HereDocuments支持变量替换 例1: ``` cat << EOF current dir=${PWD} EOF 命令输出结果如下: current dir=/data/repo/blog ``` 可以通过对delimiter的任何部分添加引号标签,取消变量替换 例2: ``` cat << "EOF" current dir=${PWD} EOF 命令输出结果如下: current dir=${PWD} ``` 例3: ``` cat << "E"OF current dir=${PWD} EOF 命令输出结果如下: current dir=${PWD} ``` ## 多行注释 使用Anonymous Here Documents对代码块进行多行注释 格式如下: ``` : <<COMMENTBLOCK echo "This line will not echo." ...... ...... COMMENTBLOCK ``` Here Document 将会创建一个临时文件,这些文件在打开就被删除,其他进程无法访问该文件 ``` $ bash -c 'lsof -a -p $$ -d0' << EOF EOF COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME lsof 4399 caodan 0r REG 0,36 0 64130 /tmp/sh-thd-1008598812 (deleted) ``` ----------------------------------------- ## Reference [0] The Linux Documentation Project __ Advanced Bash-Scripting Guide Chapter19. Here Documents --Aldous Huxley, Island `http://www.tldp.org/LDP/abs/html/here-docs.html` blog/shell/04_shell_heredoc.txt 最后更改: 2025/02/02 23:10由 127.0.0.1