使用排序命令在输入重定向中使用 bash 变量

hru*_*day 0 variables bash input jenkins command-substitution

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

id="233"
Run Code Online (Sandbox Code Playgroud)

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

bash -c 'comm -12 <(sort file1_${id}.txt) <(sort file2_${id}.txt)'
Run Code Online (Sandbox Code Playgroud)

但它抛出错误

sort: cannot read: file1_.txt: No such file or directory
sort: cannot read: file2_.txt: No such file or directory
Run Code Online (Sandbox Code Playgroud)

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

"$id"
"${id}"
'$id'
'${id}'
Run Code Online (Sandbox Code Playgroud)

che*_*ner 5

单引号防止$id从之前被扩展bash运行,并且该变量id没有在随后的膨胀外壳限定$id 尝试。

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

bash -c "comm -12 <(sort file1_${id}.txt) <(sort file2_${id}.txt)"
Run Code Online (Sandbox Code Playgroud)

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

bash -c 'comm -12 <(sort "file1_$1.txt") <(sort "file2_$1.txt")' bash "$id"
Run Code Online (Sandbox Code Playgroud)

(脚本后面的第一个参数用于 set $0;它的值并不重要,但 shell 的名称是一个很好的虚拟参数。)


(我假设bash -c '...'出于某种原因是必需的,并且您不能简单地单独使用comm -12 <(sort "file1_$id.txt") <(sort "$file2_$id.txt")。)