【问题标题】:Using a for loop inside a ssh statement replaces variable with empty string在 ssh 语句中使用 for 循环将变量替换为空字符串
【发布时间】:2020-03-12 16:47:33
【问题描述】:

我在 bash 脚本中有以下语句:

ssh $host "cd /directory; for i in *$date.gz; do echo $i; done; exit"

我希望它打印目录中以日期结尾的每个文件的名称,并且是一个 zip 文件。通过在命令行上 ssh-ing 到主机并搜索目录,我发现应该有 5 个这样的文件。但是,此脚本返回 5 个空行。我检查了 $date 变量是否在引号内正确定义(它是)。当我用'adf' 替换$i 时,脚本打印出来了

adf
adf
adf
adf
adf

所以它正确地过滤掉了这 5 个文件,但它只是没有打印它们的名称,而是将语句中的 $i 替换为什么都没有(因此该行只是 echo)。为什么要这样做,我怎样才能让它打印文件名?当我在命令行上运行这一行时,也会发生同样的事情。

【问题讨论】:

    标签: linux bash for-loop ssh


    【解决方案1】:

    通过双引号您的命令,变量扩展发生在ssh 调用之前。

    所以当你调用这个命令行时:

    ssh $host "cd /directory; for i in *$date.gz; do echo $i; done; exit"
    

    它使用两个参数调用ssh 命令:$host"cd /directory; for i in *$date.gz; do echo $i; done; exit"

    第二个参数在构建字符串时选择date 变量和i 变量的内容。但此时,您还没有正确的 i 值。

    我认为将$i 转义为\$i 应该可以解决您的问题:

    ssh $host "cd /directory; for i in *$date.gz; do echo \$i; done; exit"
    

    【讨论】:

      猜你喜欢
      • 2020-06-04
      • 1970-01-01
      • 2019-02-01
      • 2014-02-16
      • 1970-01-01
      • 1970-01-01
      • 2014-03-30
      • 1970-01-01
      • 2013-06-03
      相关资源
      最近更新 更多