大括号扩展:运行多个命令而不是在一行上扩展?

大括号扩展:运行多个命令而不是在一行上扩展?

在 bash 中使用括号扩展时,类似

echo {a,b,c}

变成

echo a b c

有没有办法将其扩展为 3 个单独的命令,每个扩展一个命令?

以便:

echo {a,b,c}

会成为

echo a
echo b
echo c

答案1

这仅仅是因为我想知道的问题,还是有实际用例?我们可以采取一些措施来完成它:

$ eval echo\ {a,b,c}\;
a
b
c

但我会追捕任何在我们的系统脚本中输入此类混淆命令的人。

为什么不去追求清晰度呢:

$ for X in {a,b,c}; do echo $X; done

您甚至可以全力以赴,添加几个换行符并稍微缩进,这样您就始终能够理解自己想要做什么。

答案2

基于Mark Mann 的精选答案,我能够进一步推导出这个例子,效果很好:

$ eval echo\ category_{17,32,33}.properties\{,.bak\}\;
category_17.properties category_17.properties.bak
category_32.properties category_32.properties.bak
category_33.properties category_33.properties.bak

这表明,当您在一行中使用多个括号扩展时,Mark 的原始示例会单独打印每个变体。相反,我想使用他的答案来移动/重命名多个文件。为了确保输出符合mv通常期望的格式 ( mv oldfilename newfilename),我转义了第二个括号扩展,这样它就不会被评估,直到初始eval命令已执行。

由于上述输出符合预期,因此我能够运行以下命令:

$ eval mv\ category_{17,32,33}.properties\{,.bak\}\;
$ ls
category_17.properties.bak  category_32.properties.bak  category_33.properties.bak

非常感谢 Mark 的原创回答。如果您喜欢他的回答让我做的事情,请为他的回答点赞 :-)

答案3

$ echo {a,b,c} | xargs -n1
a
b
c

答案4

printf '%s\n'  echo{\ a,\ b,\ c}

相关内容