일부 항목에 공백이 포함되어 있는데 문자열 변수를 배열로 변환할 수 없는 이유는 무엇입니까?

일부 항목에 공백이 포함되어 있는데 문자열 변수를 배열로 변환할 수 없는 이유는 무엇입니까?

예를 들어, 아래 코드 조각에서 array2변수를 사용하면서 동일한 작업을 (어떻게) 수행할 수 있습니까?array1str

~$ { 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그러나 사용하는 것은 일반적으로 나쁜 생각이라는 점에 유의하십시오 .

관련 정보