在 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}