我有一个脚本来重新组织我的目录结构,其中包含:
files=./*"$pattern"I{"$ifirst".."$ilast"}.ext
cp ${files} ../"$pattern"/"$i"/
当我运行脚本时,出现错误:
./*S6I{001..129}.ext: No such file or directory
但是,如果我回显该命令,然后将其复制/粘贴到终端中,我会得到我期望的行为:
cp ./*S6I{001..129}.ext ../S6/1/
为什么这不能从脚本正确运行?
答案1
由于扩展顺序的原因,您的脚本无法按您期望的方式工作。
来自 bash 手册:
展开的顺序是:大括号展开;波形符扩展、参数和变量扩展、算术扩展和命令替换(以从左到右的方式完成);分词;和路径名扩展。
如您所见,大括号扩展在前,变量扩展在后。在赋值中,不执行大括号扩展。否则表达式x={1,2}
将扩展为x=1 x=2
, 这也是没有意义的。
正如您所发现的,一个解决方案是eval
,因为整个扩展进行了两次,所以第一次变量扩展在第二次大括号扩展之前执行。
请确保您了解 的风险eval
,特别是切勿将其用于不受信任的输入。
当您使用 bash 时,您可以使用数组。
files=( ./*"$pattern"I{"$ifirst".."$ilast"}.ext )
cp "${files[@]}" ../"$pattern"/"$i"/