답변:
먼저, 사용 ls
은 단지 예 라고 가정합니다 . ls
모호하므로 쉘에서 출력을 구문 분석 할 수 없습니다 . 이것이 뉴스 인 경우 ls (1)의 출력을 구문 분석하지 않아야하는 이유를 읽으십시오 . 모든 쉘에서 파일 목록을 얻으려면 와일드 카드를 사용하십시오 (예 :) files=(*)
.
zsh에서는 다른 쉘과 마찬가지로 명령 대체 결과가 공백 문자 (보다 정확하게는 값에 따라)로 단어로 분할됩니다 IFS
. (다른 쉘과 달리, 명령 대체 결과는 zsh에서 globbing되지 않습니다.) 따라서 ls
명령 의 출력 이
hello world
wibble
다음 files=($(ls))
세트 files
3 개 요소를 포함하도록 배열 : hello
, world
및 wibble
.
명령 대체가 큰 따옴표로 묶인 경우 분할이 수행되지 않습니다. 매개 변수 확장 플래그를 사용하여 사용자 지정 분할을 수행 할 수 있습니다 . @
분할 결과가 배열임을 나타내 려면 플래그를 사용하십시오 (이상하게는 큰 따옴표 "${(@)…}"
로 묶은 문자열을 여러 단어로 확장하더라도 큰 따옴표로 확장을 유지해야합니다 ). 분할하려면 s
플래그를 사용하십시오 ( 예 : "${(@s:,:)…}"
쉼표로 분할). f
플래그는 줄 바꿈에 분할합니다.
files=("${(@f)$(ls)}")
일반적으로 배열을 반복하는 적절한 방법은 빈 요소 for f in $files[@]
를 $files
제거하는 것입니다 (여기서는 요소가 비어 있지 않기 때문에 중요하지 않음).
print $f
$f
a로 시작하고에서 -
백 슬래시를 확장 하면 스위치로 해석 됩니다 $f
. 을 사용 print -r -- $f
하거나 print -rn -- $f
문자열 뒤에 줄 바꿈을 추가하지 않으려는 경우를 사용하십시오 .
(…)
는 files
문자열이 아닌 배열 이기 때문에 필요 합니다 (이것은 명령에서 행의 연결을 포함하고에 의해 수행 된 분할을 취소합니다 (f)
). 2. foo=$'one\n\nthree', contrast
print -rl $ {(f) foo}`및을 사용하십시오 print "${(@f)foo}"
. 빈 줄을 유지하려면 큰 따옴표가 필요합니다. 빈 줄은 얻지 ls
못하지만 다른 명령으로 발생할 수 있습니다.