我在使用大括号扩展时遇到了关于 bash 中换行的愚蠢问题。
例如,我有这样的东西:
echo {a,b,c,d}
现在我想将代码拆分为几行:
echo {a,b, \
c,d}
但它不起作用。使用大括号扩展来分割代码的正确且美观的方法是什么?谢谢
答案1
根据评论,大括号扩展用于存储文件名列表。
这也可以在 shell 数组中完成,而且更简洁:
files=(
file1
file2
file{A..K}
some/other/file
some/directory/*.txt
'file with spaces in its name'
)
请注意,倒数第二个条目中的文件名 glob 将扩展到所有匹配的名称。同样,由于大括号扩展,第三个条目将扩展为fileA
, fileB
, ...。fileK
然后,循环数组以复制文件:
for file in "${files[@]}"; do
cp "$file" some/destination
done
或者只是(如果文件少于几千个),
cp "${files[@]}" some/destination
请注意,上面的引用是经过深思熟虑且重要的,否则您可能无法支持所有有效的路径名。
答案2
可以的,去掉空格就可以了
$ echo {a..\
> z}
a b c d e f g h i j k l m n o p q r s t u v w x y z
答案3
只需去掉多余的空格即可:
echo X{a,b,\
c,d}Y{e,f\
,g,h}W
这个↑↑↑可以工作并产生预期的输出:
XaYeW XaYfW XaYgW XaYhW XbYeW XbYfW XbYgW XbYhW XcYeW XcYfW XcYgW XcYhW XdYeW XdYfW XdYgW XdYhW
然而,显式for
循环可能(有时)比复杂的多行扩展更容易阅读(尽管更冗长)。再次输出相同的结果:
for x in {a..d}; do for y in {e..h}; do array+=("X${x}Y${y}W"); done; done
echo "${array[@]}"