gpt4 book ai didi

bash - bash 中的间接引用,为什么不起作用?

转载 作者:行者123 更新时间:2023-11-29 09:32:55 25 4
gpt4 key购买 nike

我试图通过对发生 6 次的事情使用一个函数来整理我的一个 bash 脚本。该脚本从 config.ini 文件中设置多个变量,然后列出它们并要求确认用户是否希望继续使用这些预定义的值。如果不是,它会遍历每个变量并要求输入一个新变量(或将其留空并按回车键以使用预定义值)。这段代码实现了这一点:

echo Current output folder: $OUTPUT_FOLDER
echo -n "Enter new output folder: "
read C_OUTPUT_FOLDER
if [ -n "$C_OUTPUT_FOLDER" ]; then OUTPUT_FOLDER=$C_OUTPUT_FOLDER; fi

想法是将 $OUTPUT_FOLDER 设置为 $C_OUTPUT_FOLDER 的值,但前提是 $C_OUTPUT_FOLDER 不为空。如果 $C_OUTPUT_FOLDER 为 null,它将不执行任何操作并保留 $OUTPUT_FOLDER 以供稍后在脚本中使用。

config.ini 中设置了 6 个变量,因此该 block 当前重复 6 次。我做了一个函数 new_config () 如下:

new_config () {
echo Current $1: ${!2}
echo -n "Enter new $1: "
read $3
if [ -n "${!3}" ]; then $2=${!3}; fi
}

我用(在这种情况下)调用它:

new_config "output folder" OUTPUT_FOLDER C_OUTPUT_FOLDER

当我运行脚本时,if 行出现错误:

./test.sh: line 9: OUTPUT_FOLDER=blah: command not found

那么,是什么给了?脚本中的代码块运行良好(在我刚接触 bash 的眼中),该函数应该做完全相同的事情。

在此先感谢您的指点。

最佳答案

问题是 bash 在 变量替换之前将命令拆分为标记,参见 http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_01_04.html#sect_01_04_01_01 .特别是 POSIX shell 的规则使赋值成为标记化的特例:"If all the characters preceding '=' form a valid name (see XBD Name), the token ASSIGNMENT_WORD shall be returned." - 它是触发分配路径的 ASSIGNMENT_WORD token 。它不会在变量替换后重复标记化,这就是您的代码不起作用的原因。

您可以让您的代码像这样工作:

new_config () {
echo Current $1: ${!2}
echo -n "Enter new $1: "
read $3
if [[ -n "${!3}" ]]; then echo setting "$2='${!3}'"; eval "$2='${!3}'"; fi
}

new_config "output folder" OUTPUT_FOLDER C_OUTPUT_FOLDER
echo $OUTPUT_FOLDER

正如@chepner 指出的那样,您可以在此处使用 declare -g $2="${!3}" 而不是 eval,在较新的 bash 版本上这是一个更好的答案。不幸的是,declare -g 需要 bash 4.2,尽管它已经 3 岁了,但它仍然不是无处不在——例如,OS X Mavericks 卡在 3.2.51 上。

关于bash - bash 中的间接引用,为什么不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22171062/

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