gpt4 book ai didi

linux - 如何在 shell 脚本变量中使用 {old,new}name?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:55:43 27 4
gpt4 key购买 nike

首先,您可以使用 linux shell 执行的这些转换的名称是什么?

$ echo {old,new}name
oldname newname

我试着将 then 放在一个变量上,如:

$ 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 替换(可能不受信任的)文件名.

关于linux - 如何在 shell 脚本变量中使用 {old,new}name?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44680746/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com