Bash
匹配變數以從數組中提取值
該腳本將根據使用者輸入回顯儲存在數組中的不同值。但是,輸出不正確,並回顯了錯誤的值。
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[@]}"
在bash
ksh93 中複製其語法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}"
。