По-перше, я припускаю, що використання - ls
це лише приклад. Ви не можете проаналізувати вихід ls
будь-якої оболонки, оскільки це неоднозначно. Прочитайте Чому ви не повинні розбирати вихід ls (1), якщо це для вас новина. У будь-якій оболонці для отримання списку файлів використовуйте символи, наприклад files=(*)
.
У zsh, як і в інших оболонках, результат заміни команд розбивається на слова на символи пробілу (точніше, за значенням IFS
). (На відміну від інших оболонок, результат заміни команд не підлягає глобалізації в zsh.) Отже, якщо вихід 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
як перемикач, якщо він починається з а -
і розширює зворотні риски в $f
. Використовуйте print -r -- $f
або print -rn -- $f
якщо ви не хочете додавати новий рядок після рядка.