提问人:Andrzej Więcławski 提问时间:9/16/2023 更新时间:9/16/2023 访问量:58
Bash 脚本中来自准备好的列表全局变量的循环
loop in bash script from prepared list global variables
问:
我想遍历文本行列表,例如:,,以在 bash 文件中的重复活动中替换它们,例如:CONFIG_SERVER_USER="client"
CONFIG_SERVER_PASS="s3cr3t"
CONFIG_SERVER_PORT=8881
if [[ -z ${CONFIG_SERVER_USER+x} ]]; then
echo "Global Variables set up:"
echo CONFIG_SERVER_USER="client" >> /etc/environment
source /etc/environment
else
echo "Required Global Variable already exists:"
fi
echo "CONFIG_SERVER_USER: $CONFIG_SERVER_USER"
#
在上面的例中,应该替换为:,以及结果回声CONFIG_SERVER_USER="client"
"CONFIG_SERVER_USER: $CONFIG_SERVER_USER"
答:
0赞
Gilles Quénot
9/16/2023
#1
让我向你展示如何使用数组:bash
user="client" pass="s3cr3t" port=8881
if ((${#config_server[@]} != 3 )); then
echo "Global Variables Arrays set up:"
echo 'declare -A config_server' >> /etc/environment
for x in user pass port; do
echo "config_server[$x]=${!x}" >> /etc/environment
done
source /etc/environment
else
echo "Required Global Array Variable already exists:"
fi
echo 'config_server array:'
for x in "${!config_server[@]}"; do
echo "$x: ${config_server[$x]}"
done
((...))
和算术命令,如果表达式为非零,则返回退出状态 0,如果表达式为零,则返回 1。也用作“let”的同义词,如果需要副作用(分配)。$((...))
查看 http://mywiki.wooledge.org/ArithmeticExpression
阵 列:
http://mywiki.wooledge.org/BashSheet#Arrays http://mywiki.wooledge.org/BashFAQ/005 http://wiki.bash-hackers.org/syntax/arrays
评论
0赞
Andrzej Więcławski
9/16/2023
但是,它在哪里建立?config_server
0赞
Gilles Quénot
9/16/2023
config_server
是数组的名称。我们遍历每个键/值以在环境文件中生成数组,然后获取它。看一下文件。
1赞
Ed Morton
9/16/2023
#2
你可能想要这样的东西:
$ cat tst.sh
#!/usr/bin/env bash
declare -A dflts=(
[CONFIG_SERVER_USER]='client'
[CONFIG_SERVER_PASS]='s3cr3t'
[CONFIG_SERVER_PORT]='888'
)
# just to test with one variable set
CONFIG_SERVER_PASS='12345'
for name in "${!dflts[@]}"; do
if [[ -z "${!name+x}" ]]; then
# echo "Global Variables set up:"
# printf "%s='%s'\n" "$name" "${dflts[$name]}" >> /etc/environment
# source /etc/environment
printf "Not set: %s='%s'\n" "$name" "${dflts[$name]}"
else
# echo "Required Global Variable already exists:"
printf "Set: %s='%s'\n" "$name" "${!name}"
fi
done
$ ./tst.sh
Not set: CONFIG_SERVER_PORT='888'
Not set: CONFIG_SERVER_USER='client'
Set: CONFIG_SERVER_PASS='12345'
完成测试后,取消对写入 env 文件的部分的注释。
评论
0赞
Andrzej Więcławski
9/16/2023
大 THNX 工作正常:)
1赞
Ed Morton
9/16/2023
不客气,请参阅 stackoverflow.com/help/someone-answers 了解下一步该怎么做。
0赞
Ed Morton
9/16/2023
@F.Hauri-GiveUpGitHub 我看到的唯一区别是您正在使用(仅测试集合)我复制了 OP 比较(用于测试集合或 null),并且您没有包含用于回显和填充其环境文件的 OPs 代码。至于“你为什么要为你的环境提供资源”——我只是在回答了他们关于如何循环变量的问题后复制了 OPs 代码(注释掉了),这样他们就清楚他们的代码如何适应解决方案。-v
-z
0赞
F. Hauri - Give Up GitHub
9/16/2023
@EdMorton 是的,我使用 .(和配件,我用来显示另一种 bashism 的用法,该 bashism 将 excamation 标记用于间接以外的其他目的。 ;) - OP 在另一个文件中对此进行回显的请求被注释掉,但存在。${!name:=${dflt[$name]}}
declare -p ${!CONFIG_*}
评论
declare -a array=(["CONFIG_SERVER_USER"]="client" ["CONFIG_SERVER_PASS"]="s3cr3t" ["CONFIG_SERVER_PORT"]=8881 ["DISCOVERY_SERVER_PORT"]=8891)
if [[ -z ${"$key"+x} ]]; then