Bash 脚本中来自准备好的列表全局变量的循环

loop in bash script from prepared list global variables

提问人:Andrzej Więcławski 提问时间:9/16/2023 更新时间:9/16/2023 访问量:58

问:

我想遍历文本行列表,例如:,,以在 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"

Linux Bash 循环

评论

0赞 Gilles Quénot 9/16/2023
你可以用 bash 的数组轻松迭代
0赞 Andrzej Więcławski 9/16/2023
那么报价呢?他们没有必要吗?
0赞 Ed Morton 9/16/2023
是的,引号是必要的,请参阅 mywiki.wooledge.org/Quotes
0赞 Andrzej Więcławski 9/16/2023
它不能用,更好的是:但是如何构建条件? 错了declare -a array=(["CONFIG_SERVER_USER"]="client" ["CONFIG_SERVER_PASS"]="s3cr3t" ["CONFIG_SERVER_PORT"]=8881 ["DISCOVERY_SERVER_PORT"]=8891)if [[ -z ${"$key"+x} ]]; then

答:

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赞 F. Hauri - Give Up GitHub 9/16/2023
@EdMorton 看看我的另一个版本,它有点短(你为什么环境;-)source
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_*}