예를 들어, 아래 코드 조각에서 array2
변수를 사용하면서 동일한 작업을 (어떻게) 수행할 수 있습니까?array1
str
~$ { str='a "b c" d'; array1=(a "b c" d); array2=( $str )
echo "${array1[1]} ${array1[2]}"
echo "${array2[1]} ${array2[2]}"; }
b c d
"b c"
답변1
Running str='a "b c" d'
, 따옴표는 문자 그대로 사용되며 그 이후에는 특별한 의미가 없습니다. 다른 문자와 마찬가지로 문자일 뿐이며 차단되지 않습니다.분사더 이상은 아닙니다.
따옴표를 사용하여 배열을 할당할 때 단어 분할을 방지하기 위해 할당 전에 따옴표가 쉘에서 평가됩니다.
array1=(a "b c" d);
참고: printf
배열을 설정하고 요소를 반복하는 것보다 문제를 시연하는 것이 더 쉽습니다.echo
printf '%s\n' $str
eval
해결 방법으로 다음을 사용할 수 있습니다.나는 이것을 추천하지 않는다모든 입력(사용자 입력, 웹 스크래핑 등)에 대해 100% 제어하거나 신뢰하지 않습니다.
eval "printf '%s\n' $str"
#or
eval "array2=( $str )"
어쨌든 귀하의 예에서는 중간 변수를 사용할 이유가 없으며 배열을 직접 사용하십시오.
답변2
예, eval
.
견적 문제 유형을 확인해 주신 모든 분들께 감사드립니다.
eval "array2=( $str )"
그냥 대신 사용하세요 array2=( $str )
.
eval
그러나 사용하는 것은 일반적으로 나쁜 생각이라는 점에 유의하십시오 .