Bash

匹配變數以從數組中提取值

  • January 4, 2022

該腳本將根據使用者輸入回顯儲存在數組中的不同值。但是,輸出不正確,並回顯了錯誤的值。

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

${assoc[@]}擴展為關聯數組的(受 split+glob 影響,因為您忘記了它周圍的引號)。對於列表,您需要"${!assoc[@]}"bashksh93 中複製其語法bash¹。

另外,為什麼要遍歷鍵直到找到那個鍵?做就是了:

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

其他注意事項:

  • 如果您想檢查它$nScript是否在數組的鍵中,您可以執行以下操作:(非空if [[ -n $nScript && -n ${Arr[$nScript]+set} ]]; then...的附加測試以解決關聯數組在空鍵上阻塞的事實)。$nScript``bash
  • $nScript似乎沒有在您的腳本中設置($script是)
  • [[ $a == $b ]]測試$a變數是否與儲存在$b中的模式匹配bash(例如ksh[[...]]構造的來源)。如果要檢查$a$b是否相同,則需要[[ $a == "$b" ]].

¹如果它複製了 zsh 的語法,那將是"${(k@)assoc}"

引用自:https://unix.stackexchange.com/questions/684915