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

时间:2017-06-21 15:45:24

标签: linux bash shell

首先,你可以用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。想,这是最好的方法吗?

2 个答案:

答案 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"
}