cp 从命令行运行,但从脚本中找不到文件

cp 从命令行运行,但从脚本中找不到文件

我有一个脚本来重新组织我的目录结构,其中包含:

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"/

相关内容