Как перебирать индексы массива в zsh?

Как указано в других ответах, echoне читается со стандартного ввода, поэтому он не будет печатать вывод pwd. На всякий случай, если вы еще не знаете, pwdпечатает свой вывод сам по себе, поэтому вам просто нужно запустить его в одиночку, чтобы получить желаемый результат.

$ pwd
/current/working/dir

Если вы действительно хотите использовать эхо для этого, вы можете использовать Подстановку команд . Это передаст вывод вашей команды(pwdechoв качестве параметра. Что опять же в этом примере не требуется, так как pwdбудет выводить свой собственный... вывод на стандартный вывод.

$ echo "$(pwd)"
/current/working/dir

6
24.08.2020, 19:15
3 ответа

zsh Массивы являются обычными массивами, как и в большинстве других оболочек и языков, они не похожи на ассоциативные массивы ksh/bash с ключами, ограниченными положительными целыми числами (или разреженными массивами ). zshимеет отдельный тип переменной для ассоциативных массивов (с ключами, представляющими собой произвольные последовательности из 0 или более байтов ).

Таким образом, индексы для обычных массивов всегда представляют собой целые числа в диапазоне от 1 до размера массива (при условии, что совместимость с ksh не включена, и в этом случае индексы массива начинаются с 0 вместо 1 ).

Так:

typeset -a array
array=(a 'b c' '')
for ((i = 1; i <= $#array; i++)) print -r -- $array[i]

Хотя, как правило, вы перебираете элементы массива, а не их индексы.:

for i ("$array[@]") print -r -- $i

(синтаксис "$array[@]", в отличие от $array, сохраняет пустые элементы ).

или:

print -rC1 -- "$array[@]"

для передачи всех элементов в команду.

Теперь для циклического перебора ключей ассоциативного массива используется следующий синтаксис:

typeset -A hash
hash=(
  key1  value1
  key2  value2
  ''    empty
  empty ''
)
for key ("${(@k)hash}") printf 'key=%s value=%s\n' "$key" "$hash[$key]"

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

Хотя вы также можете передавать как ключи, так и значения командам с помощью:

printf 'key=%s value=%s\n' "${(@kv)hash}"

Для получения дополнительной информации о различных конструкциях массивов в Bourne -, таких как оболочки, см. Проверка поддержки массивов оболочкой

.
12
18.03.2021, 23:10

Как сказано в этой статье Руководство пользователя по Z -Оболочка -Глава 5 :Подстановки:

Это расширяется для других параметров следующим образом:

% array=(one two three)
% print -l "${array[@]}"
one
two
three

и вообще для всех форм замены с использованием другого флага (@):

% print -l "${(@)array}"
one
two
three

Так что, может быть, попробовать использовать второй способ?

2
18.03.2021, 23:10

И с фигурными скобками{ }:

% test=(a "b c d" e f)                 
% for i in {1..$#test}; do echo $i; done
1
2
3
4
%
1
23.09.2021, 21:37

Теги

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