Расширение параметра Zsh

У меня была такая же проблема в оболочке strict posix. Я сделал это за два прохода с неиспользованным символом

cat data.json|tr '§' '?'|sed -e 's/"[^"]":/§&/g'|tr '§' '\n'
3
26.10.2019, 00:22
1 ответ

fpath — это массив. Вы не должны пытаться понизить его до строки, а затем заменить в ней символы на символы новой строки.

Сksh-подобным синтаксисом расширения массива:

$ printf '%s\n' "${fpath[@]}"
/usr/local/share/zsh/site-functions
/usr/share/zsh/site-functions
/usr/share/zsh/5.7.1/functions

С помощью zshвы также можете использовать "$fpath[@]"или "${(@)fpath}".

Вы также можете:

$ printf '%s\n' $fpath
/usr/local/share/zsh/site-functions
/usr/share/zsh/site-functions
/usr/share/zsh/5.7.1/functions

Но учтите, что он пропускает пустые элементы массива (, скорее всего, это не проблема для$fpath).

Встроенная функция

zshprintтакже может печатать элементы по одному в строке с опцией -l. Как и в ksh, откуда исходит встроенная функция print, вам нужна опция -r, чтобы печатать произвольные необработанные данные, поэтому:

print -rl -- $fpath

будет эквивалентно стандартному printf '%s\n'.

Они отличаются от -C1, когда $fpathявляется пустым списком, и в этом случае print -rC1 -- $fpathничего не выводит, а print -rlи printf '%s\n'выводят одну пустую строку, поэтому

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

, вероятно, ближе всего к тому, что вы хотите печатать элементы массива по одному в строке, которые в bash/kshвы могли бы написать:

[ "${#array[@]}" -eq 0 ] || printf '%s\n' "${array[@]}"
4
27.01.2020, 21:17

Теги

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