匹配变量以从数组中提取值

匹配变量以从数组中提取值

该脚本将根据用户输入回显存储在数组中的不同值。但是,输出不正确并且回显了错误的值。

AA_P=/root/run_Scripts/AA_P_run.sh
AA_S=/root/run_Scripts/AA_S_run.sh

read -p "Enter 'P' or 'S'"$'\n' P_S

read -p "How many runs?"$'\n' runs

script="AA${P_S}"
echo $script

echo ""
declare -A Arr=( [AAP]=$AA_P [AAS]=$AA_S )

for key in ${Arr[@]}; do
    if [[ $key == $nScript ]]; then
        key="${Arr[$key]}"
    fi

    while [ $runs -gt 0 ]; do
        echo $key 
        (( runs=runs-1 ))
    done
done
exit 

当输入为“S”和“3”时,输出如下。

AAS

/root/run_Scripts/AA_P_run.sh
/root/run_Scripts/AA_P_run.sh
/root/run_Scripts/AA_P_run.sh

为什么脚本不回显'/root/run_Scripts/AA_S_run.sh

答案1

${assoc[@]}扩展到价值观关联数组的(受 split+glob 影响,因为您忘记了它周围的引号)。对于列表,您需要像 ksh93 中那样复制其"${!assoc[@]}"语法。bashbash

另外,为什么要循环遍历这些键直到找到那个呢?做就是了:

while ((runs--)); do
 printf '%s\n' "${Arr[$nScript]}"
done

其他注意事项:

  • 如果您想检查它$nScript是否在数组的键中,您可以执行以下操作:(非空的if [[ -n $nScript && -n ${Arr[$nScript]+set} ]]; then...附加测试以解决关联数组因空键而阻塞的$nScript事实)。bash
  • $nScript您的脚本中似乎没有设置($script是)
  • [[ $a == $b ]]测试变量是否与存储在in 中$a的模式匹配(例如该构造的来源)。如果你想检查和是否相同,你需要.$bbashksh[[...]]$a$b[[ $a == "$b" ]]

1 如果它复制了 zsh 的语法,那就会是"${(k@)assoc}"这样。

相关内容