首先,你可以用linux shell做这些转换的名称是什么?
$ echo {old,new}name
oldname newname
我试着将变量放在变量上,如:
$ var={old,new}name
$ echo $var
{old,new}name
但我们可能会看到他们停止工作。我在变量上需要它们以允许在批量操作上轻松更改它们:
mv {old,new}name/"file 1.txt"
mv {old,new}name/"file 2.txt"
mv {old,new}name/"file 3.txt"
mv {old,new}name/"file 4.txt"
所以我可以把它们写成:
var={old,new}
mv '$var'name/"file 1.txt"
mv '$var'name/"file 2.txt"
mv '$var'name/"file 3.txt"
mv '$var'name/"file 4.txt"
另外,我无法将shell变量和name
补码组合在一起,即$varname
。我想在$var
名称周围使用单引号,即'$var'name
。想,这是最好的方法吗?
答案 0 :(得分:3)
您可以将扩展结果存储在数组中:
ComboBox
但是,在参数扩展(即替换变量的值)之后完成大括号扩展。这是出于令人信服的原因:如果将数据解析为代码,则无法在bash中编写处理不受信任数据的脚本。
坦率地说,对于您的示例代码,只需编写它就可以了:
var=( {old,new}name ) # performs expansion, stores results in var
printf '%s\n' "${var[@]}" # prints "oldname" and "newname"
那就是说,如果你想做危险的,不安全的 - 没有极端谨慎的事情,那么这种谨慎的方法可能是这样的:
for name in name/"file "{1,2,3,4}.txt; do
mv -- old"$name" new"$name"
done
在这里,我们使用var='{old,new}'
for f in "file 1.txt" "file 2.txt" "file 3.txt" "file 4.txt"; do
printf -v cmd 'mv %sname/%q' "$var" "$name" && eval "$cmd"
done
替换大括号扩展(手写,可信代码)和%s
来替换(可能是不可信的)文件名。
答案 1 :(得分:1)
您不希望在不需要时评估变量的内容。 其中一个选择是写一个函数。
function oldnewname { mv oldname/"$1" newname/"$1" }
oldnewname "file 1.txt"
oldnewname "file 2.txt"
oldnewname "file 3.txt"
oldnewname "file 4.txt"
当名称是动态名称时,您可以更改功能
function oldnew { mv old"$1"/"$2" new"$1"/"$2" }
oldnew name "file 1.txt"
oldnew name "file 2.txt"
oldnew name "file 3.txt"
oldnew name "file 4.txt"
编辑: 自从我迁移到Linux和Bash后,我忽略了POSIX。正如@Charles评论的那样,更具便携性
oldnewname()
{
mv oldname/"$1" newname/"$1"
}