변수를 일치시켜 배열에서 값을 추출합니다.

변수를 일치시켜 배열에서 값을 추출합니다.

스크립트는 사용자 입력에 따라 배열에 저장된 다양한 값을 에코합니다. 그러나 출력이 잘못되어 잘못된 값이 에코됩니다.

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[@]}다음으로 확장가치연관 배열의 경우(주위에 따옴표를 잊어버렸기 때문에 분할+글로브의 영향을 받음) 목록용열쇠, ksh93 에서와 같이 "${!assoc[@]}"구문을 복사해야 합니다.bashbash

또한 키를 찾을 때까지 키를 반복하는 이유는 무엇입니까? 그냥 해:

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

기타 참고사항:

  • $nScript배열의 키에 있는지 확인하려면 다음을 수행할 수 있습니다. ( if [[ -n $nScript && -n ${Arr[$nScript]+set} ]]; then...연관 배열이 null 키를 차단한다는 사실을 설명하기 위해 null이 아닌지에 대한 추가 테스트 $nScript)bash
  • $nScript스크립트에 설정되지 않은 것 같습니다( $script예).
  • [[ $a == $b ]]변수가 저장된 패턴 $a(즉, 구문의 소스)과 일치하는지 테스트합니다. 과 가 같은지 확인하려면 가 필요합니다.$bbashksh[[...]]$a$b[[ $a == "$b" ]]

1 zsh의 구문을 복사한 경우에 해당됩니다 "${(k@)assoc}".

관련 정보