【问题标题】:Using bash variable in input redirection with sort command使用排序命令在输入重定向中使用 bash 变量
【发布时间】:2020-09-02 13:56:35
【问题描述】:

我在 Jenkins Execute shell 块中有一个如下编写的 bash 脚本

id="233"

我想在下面的命令中使用这个 id 变量

bash -c 'comm -12 <(sort file1_${id}.txt) <(sort file2_${id}.txt)'

但是会报错

sort: cannot read: file1_.txt: No such file or directory
sort: cannot read: file2_.txt: No such file or directory

我尝试了以下但没有运气,不知道如何解决

"$id"
"${id}"
'$id'
'${id}'

【问题讨论】:

    标签: bash variables jenkins input command-substitution


    【解决方案1】:

    单引号可防止在bash 运行之前扩展$id,并且变量id 未在随后尝试扩展$id 的shell 中定义。。 p>

    简单(但脆弱)的解决方案是使用双引号,以便 $id 扩展以生成在新 shell 中运行的命令。

    bash -c "comm -12 <(sort file1_${id}.txt) <(sort file2_${id}.txt)"
    

    一个更健壮的解决方案是将$id 的值作为参数传递给shell(并在命令中使用双引号in 来保护$1 的扩展,如果值为$id 要求)。

    bash -c 'comm -12 <(sort "file1_$1.txt") <(sort "file2_$1.txt")' bash "$id"
    

    (脚本后面的第一个参数用于设置$0;它的值无关紧要,但shell的名称是一个很好的虚拟参数。)


    (我假设由于某种原因需要bash -c '...',而您不能简单地单独使用comm -12 &lt;(sort "file1_$id.txt") &lt;(sort "$file2_$id.txt")。)

    【讨论】:

      【解决方案2】:
      bash -c 'comm -12 <(sort file1_'$id'.txt) <(sort file2_'$id'.txt)'
      

      上面的行现在可以工作了

      【讨论】:

      • 这很脆弱,如果$id 的值由于分词或路径名扩展而产生多个单词。
      • @chepner 是的。但 $id 将始终只替换为一个值。所以我认为它现在适合我。
      • 但您不仅仅是在为自己回答问题。其他人可能有类似的问题,但没有你的限制,这对他们来说会崩溃。
      • @chepner 好的。酷
      猜你喜欢
      • 1970-01-01
      • 2017-11-25
      • 2023-04-08
      • 1970-01-01
      • 2018-09-25
      • 2012-05-06
      • 2020-03-22
      • 2014-06-27
      • 2012-03-02
      相关资源
      最近更新 更多