繁体   English   中英

如何在Shell脚本变量中使用{old,new}名称?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM