Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Bash中管理子变量_Bash_Loops_Variables_Variable Assignment - Fatal编程技术网

在Bash中管理子变量

在Bash中管理子变量,bash,loops,variables,variable-assignment,Bash,Loops,Variables,Variable Assignment,我想在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的数字序列,而不是使用数组的随机数 for n in 1 2; do key[n]="${RANDOM:

我想在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
的数字序列,而不是使用数组的随机数

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

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

此外,在bash中,从0开始计算通常比从1开始计算更好,并且不需要导出变量,除非您想运行其他程序在继承的环境中查找变量。

使用数组

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

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

此外,在bash中,从0开始计算通常比从1开始计算更好,并且不需要导出变量,除非您想运行其他程序在继承的环境中查找变量。

您可以使用数组(请参见@MarkReed),或者使用
声明

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
您可以使用数组(请参见@MarkReed),也可以使用
声明

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键$n'%s'${RANDOM:0:2}“
。要检索它,可以使用间接扩展:
v=key$n;v=${!v}
(这是OP缺少的部分)。我真的不喜欢你的
key\u get
函数:不要使用
declare-p
:你在使用一个子shell,那么你需要解析字符串
v
来删除(错误地)引号(这里没问题,但你的方法不是通用的:如果字段中有引号,它将失败). 而使用间接扩展将更优雅、高效和稳健地解决所有这些问题;我只是想和declare试一下。。。间接扩展更好,数组更多。您还可以使用
printf
printf-v键$n'%s'${RANDOM:0:2}“
。要检索它,可以使用间接扩展:
v=key$n;v=${!v}
(这是OP缺少的部分)。我真的不喜欢你的
key\u get
函数:不要使用
declare-p
:你在使用一个子shell,那么你需要解析字符串
v
来删除(错误地)引号(这里没问题,但你的方法不是通用的:如果字段中有引号,它将失败). 而使用间接扩展将更优雅、高效和稳健地解决所有这些问题;我只是想和declare试一下。。。间接扩展更好,阵列甚至更多。