Bash:while 循环编号变量

Ber*_*enz 0 bash variable

我的环境可以使用以下格式定义灵活数量的变量:

Var1Value=A
Var2Value=B
Var3Value=C
Run Code Online (Sandbox Code Playgroud)

我现在想遍历变量,只要它们存在。在伪代码中:

i=1
while [exists "Var"$i"Value"]; do
 echo "found variable, now doing some more complex processing logic"
 #do some more stuff
 i=$((i + 1)) 
done
Run Code Online (Sandbox Code Playgroud)

我是否在 bash 中完成这项工作(不使用数组)?

ilk*_*chu 5

使用nameref。它们的工作方式类似于指向其他变量的指针(在 Bash 4.3 及更高版本中):

Var1Value=A
Var2Value=B
Var3Value=C
Var4Value=""

for (( i=1 ; ; i++ )); do
    n="Var${i}Value"                # the name of var
    declare -n p="$n"               # reference to the var
    [ "${p+x}" ] || break           # see if it exists
    echo "$n: '$p'"
done
Run Code Online (Sandbox Code Playgroud)

"${p+x}"评估指向x的变量是否p存在,因此这也处理设置但为空的变量。

或者,使用间接变量扩展${!n},它指的是由 命名的变量n

for (( i=1 ; ; i++ )); do
    n="Var${i}Value"                # the name of var
    [ "${!n+x}" ] || break          # see if it exists
    echo "$n: '${!n}'"
done
Run Code Online (Sandbox Code Playgroud)

但实际上,您应该使用数组。这里的三个选择都不是标准的,但数组是迄今为止最合乎逻辑的。

VarValue=( A B C )

for value in "${VarValue[@]}"; do
    # use "$value" here
    printf 'Value is "%s"\n' "$value"
done
Run Code Online (Sandbox Code Playgroud)

也可以看看: