Как указано в других ответах, echo
не читается со стандартного ввода, поэтому он не будет печатать вывод pwd
. На всякий случай, если вы еще не знаете, pwd
печатает свой вывод сам по себе, поэтому вам просто нужно запустить его в одиночку, чтобы получить желаемый результат.
$ pwd
/current/working/dir
Если вы действительно хотите использовать эхо для этого, вы можете использовать Подстановку команд . Это передаст вывод вашей команды(pwd
)в echo
в качестве параметра. Что опять же в этом примере не требуется, так как pwd
будет выводить свой собственный... вывод на стандартный вывод.
$ echo "$(pwd)"
/current/working/dir
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 -, таких как оболочки, см. Проверка поддержки массивов оболочкой
.Как сказано в этой статье Руководство пользователя по Z -Оболочка -Глава 5 :Подстановки:
Это расширяется для других параметров следующим образом:
% array=(one two three)
% print -l "${array[@]}"
one
two
three
и вообще для всех форм замены с использованием другого флага (@):
% print -l "${(@)array}"
one
two
three
Так что, может быть, попробовать использовать второй способ?
И с фигурными скобками{ }
:
% test=(a "b c d" e f)
% for i in {1..$#test}; do echo $i; done
1
2
3
4
%