[英]How to use {old,new}name inside a shell script variable?
首先,您可以使用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
周围使用单引号。 认为,这是最好的方法吗?
您可以将扩展结果存储在数组中:
var=( {old,new}name ) # performs expansion, stores results in var
printf '%s\n' "${var[@]}" # prints "oldname" and "newname"
但是,括号扩展是在参数扩展(即变量值的替换)之后完成的。 这是出于令人信服的原因:如果将数据解析为代码,则不可能在bash中编写处理不可信数据的脚本。
坦白说,对于您的示例代码,这样写就短了一些:
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
代替大括号扩展名(手写的,受信任的代码),并使用%q
替代(可能是不受信任的)文件名。
不需要时,您不想评估变量的内容。 一种选择是编写函数。
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"
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.