这里记录:无参数扩展(Here document: no parameter expansion)

2019-10-23 16:08发布

有没有什么办法来关闭参数扩展这里文档中?

Shell命令:

$ cat > analyze.sh <<EOF    
awk -F: '{print $NF}' asr.log | sort > tmp  
awk -F '(' '{print $NF}' asr.log | awk '{print $1}' |  sort > tmp2
EOF

我在analyze.sh得到这个:

awk -F: '{print }' asr.log | sort > tmp
awk -F '(' '{print }' asr.log | awk '{print }' |  sort > tmp2

Answer 1:

你需要使用引号分隔符:

$ cat > analyze.sh <<"EOF"    
awk -F: '{print $NF}' asr.log | sort > tmp  
awk -F '(' '{print $NF}' asr.log | awk '{print $1}' |  sort > tmp2
EOF

这可以防止扩大此文档的外壳:

$ cat analyze.sh 
awk -F: '{print $NF}' asr.log | sort > tmp  
awk -F '(' '{print $NF}' asr.log | awk '{print $1}' |  sort > tmp2

文档

这是记录在man bash

在这里,文件的格式为:

  <<[-]word here-document delimiter 

没有参数和变量扩展,命令替换,算术扩展,或路径扩展是在字执行。 如果word中任何字符被引用,分隔符是引用删除对词的结果,而在这里,文件中的行不会被扩展。 如果字是带引号的,此时此地文档中的所有行经受参数扩展,命令替换和算术扩展字符序列\被忽略,\必须使用引用字符\,$,和`。 [强调]



Answer 2:

你可以引述EOF禁用扩展:

cat > analyze.sh <<'EOF'
awk -F: '{print $NF}' asr.log | sort > tmp  
awk -F '(' '{print $NF}' asr.log | awk '{print $1}' |  sort > tmp2
EOF


文章来源: Here document: no parameter expansion
标签: linux bash shell