쉘 스크립트를 실행할 때 sh -c가 올바른 출력을 얻지 못합니다.

쉘 스크립트를 실행할 때 sh -c가 올바른 출력을 얻지 못합니다.

셸의 배열에서 데이터를 가져오기 위해 반복하며
다음 내용이 포함된 셸 파일에서 데이터를 실행할 때 작동합니다.

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'

관련 정보