在 bash 大括号扩展中拆分代码

在 bash 大括号扩展中拆分代码

我在使用大括号扩展时遇到了关于 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[@]}"

相关内容