zsh: цикл for по записям, разделенным новой строкой

На странице руководства указано следующее:

gtk-launch takes at least one argument, the name of the application to launch. The name should match application desktop file name, as residing in /usr/share/application, with or without the '.desktop' suffix.

Это указывает на то, что файл рабочего стола должен находиться в указанном месте, иначе его нельзя будет использовать для запуска приложения. Исходный файл gtk/gtk -launch.c показывает, что gtk -launch ничего не выполняет, но помещает сообщение на шину D -с запросом на запуск требуемого приложения.

4
16.02.2020, 09:19
2 ответа

Чтобы разделить новую строку в zsh, вы используете флаг расширения параметраf(fдля строки feed ), который является сокращением отps:\n::

for num (${(f)numholds}) print -r New item: $num

Вы также можете использовать$IFS-разбиение, которое вzsh(в отличие от других Bourne -подобных оболочек )вы должны явно запрашивать расширение параметра, используя$=paramсинтаксис($=немного похоже на ножницы):

for num ($=numholds) print -r New item: $num
10
28.04.2021, 23:23

Ваша переменная является строкой, а не массивом. То, что он содержит символы новой строки, не имеет значения. Ваш for num in $numholdsвидит все это как единое значение, так как вы его сохранили.

Простым обходным решением было бы использование цикла whileи строковой конструкции <<<здесь -для его передачи:

% while read num; do echo "$num"; echo "New Item"; done <<<"$numholds"
409503
New Item
409929
New Item
409930
New Item
409932
New Item
409934
New Item
409936
New Item
409941
New Item
409942
New Item
409944
New Item
409946
New Item

Это по существу эквивалентно более уродливому (см. здесь , почему это плохая идея):

% for num in $(echo "$numholds"); do echo $num; echo "new item"; done
409503
new item
409929
new item
409930
new item
409932
new item
409934
new item
409936
new item
409941
new item
409942
new item
409944
new item
409946
new item

Наконец, вы можете вместо этого сделать переменную массивом:

numArray=($(echo "$numholds"))

Теперь вы можете использовать нужную конструкцию:

% for num in "${numArray[@]}"; do echo $num; echo "new item"; done                   
409503
new item
409929
new item
409930
new item
409932
new item
409934
new item
409936
new item
409941
new item
409942
new item
409944
new item
409946
new item
tpad% 
2
28.04.2021, 23:23

Теги

Похожие вопросы