【问题标题】:Here document: no parameter expansion这里文档:没有参数扩展
【发布时间】:2015-07-05 06:07:42
【问题描述】:

有什么方法可以关闭文档中的参数扩展?

外壳命令:

$ 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

【问题讨论】:

  • 在此处文档的开头引用或转义“限制字符串”会禁用其正文中的参数替换。见:Heredocs

标签: linux bash shell


【解决方案1】:

您可以引用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

【讨论】:

    【解决方案2】:

    你需要引用分隔符:

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

    这可以防止 shell 扩展 here-document:

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

    文档

    这记录在man bash:

    here-documents的格式为:

              <<[-]word
                      here-document
              delimiter
    

    没有对 word 执行参数和变量扩展、命令替换、算术扩展或路径名扩展。 如果 word中的任何字符都被引用, 分隔符是 word 上去掉引号的结果,并且 here-document 中的行没有被扩展。 如果 word 没有被引用,则所有 这里文档的行是 经过参数扩展、命令替换和算术扩展,字符序列\被忽略, 并且 \ 必须用于引用 字符 \、$ 和 `。 [强调补充]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-02-01
      • 2011-06-07
      • 1970-01-01
      • 2020-05-16
      • 1970-01-01
      • 1970-01-01
      • 2010-12-12
      • 1970-01-01
      相关资源
      最近更新 更多