我想在 bash 脚本中运行以下命令,但是它不起作用。
命令:
cp /tmp/first/{abc.conf,xyz.conf} /tmp/backup/
bash脚本:
firstDir=/tmp/first
#secondDir=/tmp/second
validDir=$firstDir
#validDir=$secondDir
backupDir=/tmp/backup
files='{abc.conf,xyz.conf}'
join=$firstDir/$files
#join=$secondDir/$files
cp $join $backupDir
exit 0
rm -rf $validDir
mkdir $validDir
cp ("$backupDir/*.conf") $validDir
错误:
cp: cannot stat '/tmp/first/{abc.conf,xyz.conf}': No such file or directory
目标是清理目录,然后只放回这 2 个文件。
答案1
支撑扩张发生前参数被扩展,所以
files='{abc.conf,xyz.conf}'
join=$firstDir/$files
结果实际上将变量设置为/tmp/first/{abc.conf,xyz.conf}
,并且在命令中扩展它时不会重新处理它cp
。
相反,你可以写
cp "$firstDir"/{abc.conf,xyz.conf} "$backupDir"
从字面上看,它将按照您想要的方式扩展。
无法强制变量发生大括号扩展,但您可以使用数组将文件名和命令分开,甚至使用大括号扩展来定义它:
files=( "$firstDir"/{abc.conf,xyz.conf} )
然后${files[@]}
。