我正在做一个脚本来下载多个部分的一个文件,我正在加入该文件。我可以加入脚本之外的部分
cat name.part{0..4} > name.ext
但是,如果我在脚本中使用它
cat $filename.part{0..$N} > $filename
我得到:
cat: Bitcoin-960x623.jpg.part{0..5}: No such file or
{0..4}
是一个大括号扩展; $N
是一个可变的扩展。 您的表达式无法按预期工作,因为大括号扩展发生在变量扩展之前:
顺序为:大括号扩展、波浪号扩展、参数、变量和算术扩展和命令替换(以从左到右的方式完成)、单词拆分和文件名扩展。
http://www.gnu.org/software/bash/manual/bashref.html#Shell-Expansions
您可以使用 seq
命令而不是大括号扩展来生成所需的文件名,最多为 N:
$ filename=myfile
$ N=4
$ cat $(seq -f "$filename.part%g" 0 $N) > name.ext
$
万一seq -f
不可用,您可以改用 for 循环单行
$ cat $(for ((i=0; i<N; i++)); do echo "$filename.part$i"; done) > name.ext
$
我用这个解决了。
for (( k=0 ; k<=$N ; k++ ))
do
cat $filename.part$k >> $filename
done
不能在 shell 中的大括号内使用变量。 eval
可以在这里使用:
eval "$filename.part{0..$N} > $filename"
断言:我要争辩说这个答案更好。(我不经常或轻易做的事情。我的理由是,在这次编辑时,这里的所有其他答案都只是扩展到整数范围,无论与这些整数匹配的文件是否存在。通过使用全球扩展,您可以保证不会遇到来自cat
的No such file or directory
。在所有其他情况下,使用大括号扩展、eval、seq
和 for 循环,您必须明确检查。
如果文件名总数少于 10 个:
cat "$filename".part[0-9]
将作为一个全球扩展到有多少名称。这是一个快速且便携的解决方案,但显然受到限制。如果超过 10 个,那么该模式将只匹配一位数字的模式,因此您必须更灵活一点并使用 extglob:
shopt -s extglob
cat "$filename".part+([0-9])
应该这样做,但这只适用于伯恩-再次谢尔。(也就是说,其他几个现代外壳具有类似于extglob的扩展能力。