【问题标题】:Manage Sub-variables in Bash在 Bash 中管理子变量
【发布时间】:2015-01-05 19:59:23
【问题描述】:

我想在 Bash 中管理子变量。我可以分配子变量,但我不知道如何使用它:

#/bin/bash

n=1

for lvl in 1 2;
do
    export key$n="${RANDOM:0:2}"
    let n=$n+1
done


for num in 1 2; do

echo $key$num

done

如果我使用echo $key$num,它会打印变量$num的数字序列,而不是随机数

【问题讨论】:

标签: bash loops variables variable-assignment


【解决方案1】:

使用数组。

for n in 1 2; do 
  key[n]="${RANDOM:0:2}"
done

for num in 1 2; do
  echo "${key[num]}"
done

http://mywiki.wooledge.org/BashGuide/Arrays

此外,在 bash 中,通常从 0 开始计数而不是 1 会更好,并且您不需要 export 变量,除非您想运行一些其他程序来在其继承的环境中查找它们.

【讨论】:

    【解决方案2】:

    你可以使用数组(见@MarkReed),或者使用declare

    for n in 1 2; do
        declare -- key$n="${RANDOM:0:2}"
    done
    
    for n in 1 2; do
        v=$(declare -p key$n) ; v="${v#*=}" ; echo "${v//\"/}"
    done
    

    同样的使用函数:

    key_set () # n val
    {
        declare -g -- key$1=$2
    }
    
    key_get () # n
    {
        local v=$(declare -p key$1) ; v="${v#*=}" ; echo "${v//\"/}"
    }
    
    for n in 1 2; do
        key_set $n "${RANDOM:0:2}"
    done
    
    for n in 1 2; do
        key_get $n
    done
    

    【讨论】:

    • 你也可以使用printf:printf -v key$n '%s' "${RANDOM:0:2}"。要检索它,您可以使用间接扩展:v=key$n; v=${!v}(这是 OP 缺少的部分)。
    • 我真的不喜欢你的key_get 函数:不要使用declare -p:你正在使用一个子shell,那么你需要解析字符串v 以删除(错误地)引号(这里没关系,但你的方法不通用:如果字段中有引号,它会失败)。而使用间接扩展可以更优雅、更高效、更稳健地解决所有这些问题。
    • 事实上;我只是想尝试一下 declare... 间接扩展更好,数组更多。
    猜你喜欢
    • 1970-01-01
    • 2017-08-15
    • 1970-01-01
    • 2018-03-20
    • 2015-11-25
    • 1970-01-01
    • 2015-02-07
    • 1970-01-01
    • 2014-09-16
    相关资源
    最近更新 更多