【问题标题】:set variable in heredoc section在 heredoc 部分设置变量
【发布时间】:2011-06-27 01:07:53
【问题描述】:

我是一个shell脚本新手,所以我一定在做一些愚蠢的事情,为什么这不起作用:

#!/bin/sh

myFile=$1

while read line
do
ssh $USER@$line <<ENDSSH
ls -d foo* | wc -l 
count=`ls -d foo* | wc -l`
echo $count
ENDSSH
done <$myfile

应该打印两行,每行都应该有相同的值......但他们没有。第一个打印语句 [ls -d foo* 的结果 | wc -l] 有正确的值,第二个打印语句不正确,它总是打印空白。我需要做一些特殊的事情来为 $count 赋值吗?

我做错了什么?

谢谢

【问题讨论】:

    标签: bash shell heredoc


    【解决方案1】:
    #!/bin/sh
    
    while read line; do
      echo Begin $line
      ssh $USER@$line << \ENDSSH
      ls -d foo* | wc -l 
      count=`ls -d foo* | wc -l`
      echo $count
    ENDSSH
    done < $1
    

    您的脚本的唯一问题是,当没有引用 heredoc 标记时,shell 会进行变量扩展,因此在远程命令发送之前,本地 shell 正在扩展 $count...

    【讨论】:

    • 这行得通!谢谢你。既然你提到引用heredoc 令牌,我试过了,它也有效。你能解释一下我什么时候应该和不应该引用heredoc令牌吗?谢谢。
    • 如果要执行变量替换,请不要引用它。如果您只想将这些位运走,请引用它。在您的情况下,它有点复杂,因为外壳最终会获取输入,因此它们最终会被扩展,但您不希望它发生在本地外壳中。
    • 不错的答案!我不明白为什么\ENDSSH 工作。我认为 Bash manual on Here documents 中没有提到它
    • 嗯,通常 heredoc 行具有扩展的参数、命令和算术表达式。引用标记符号的第一次出现可以防止这种情况。那么,问题就变成了,您是想要扩展这些表达方式,还是想要按字面意思理解文本?
    猜你喜欢
    • 2017-08-23
    • 2018-10-01
    • 1970-01-01
    • 2019-03-05
    • 1970-01-01
    • 2013-10-07
    • 2017-05-12
    • 2018-04-17
    相关资源
    最近更新 更多