셸의 배열에서 데이터를 가져오기 위해 반복하며
다음 내용이 포함된 셸 파일에서 데이터를 실행할 때 작동합니다.
arr=(1 2 3 4 5)
for var in ${arr[@]};
do
echo $var
done
sh -c
하지만 아래와 같이 사용하면 출력이 없습니다.
sh -c "arr=(1 2 3 4 5);for var in ${arr[@]};do echo $var;done"
답변1
문제는 을(를) 사용하고 있습니다 sh -c "..."
. 참조하세요.@gils의 답변자세한 내용은.
더 나아가 sh
(참조POSIX sh)는 배열을 지원하지 않습니다(엄격히 말하면 배열은 하나뿐이므로,$@), 지원하는 시스템의 다른 셸 또는 다른 배열을 호출 bash
해야 zsh
합니다 ksh
.
bash -c 'arr=(1 2 3 4 5);for var in "${arr[@]}";do echo "$var"; done'
${arr[@]}
또한 역참조할 때 실수를 했다는 점에 유의하세요. 실제로 for var in "${arr[@]}"
이를 변경해야 합니다.따옴표가 없는 변수로 분할+glob을 호출하는 것은 많은 보안 취약점의 원인입니다..
POSIX sh를 사용하려면 다음을 사용할 수 있습니다.$@:
set -- 1 2 3 4 5
for var do
printf '%s\n' "$var"
done
답변2
문제는 잘못된 인용 유형을 사용하고 있다는 것입니다. 쉘은 큰따옴표 안에 변수를 삽입하므로 변수 참조는 실행 중인 쉘에 의해 삽입됩니다 sh -c "…"
. 쉘이 변수의 이름을 지정 arr
하거나 var
정의하지 않는다고 가정하면 매개변수 sh -c
는 다음과 같습니다 .
arr=(1 2 3 4 5);for var in ;do echo ;done
배열 인식 셸 이라면 sh
이는 완벽하게 유효한 코드이지만 아무 작업도 수행하지 않습니다.
리터럴 문자열을 명령에 전달하려면 작은따옴표를 사용하십시오. 작은따옴표 안의 모든 문자는 문자 그대로 해석되므로 작은따옴표를 제외한 문자열의 모든 문자를 사용할 수 있습니다. (작은 따옴표가 필요한 경우4자리 시퀀스로 이스케이프 처리하세요.'\''
.)
sh -c 'arr=(1 2 3 4 5);for var in ${arr[@]};do echo $var;done'
모든 구현이 배열을 지원하는 것은 아닙니다 sh
. 배열이 필요한 경우 이를 지원하는 셸을 명시적으로 호출해야 합니다.
ksh -c 'arr=(1 2 3 4 5);for var in ${arr[@]};do echo $var;done'
또는
bash -c 'arr=(1 2 3 4 5);for var in ${arr[@]};do echo $var;done'