Сzsh
:
string=WER
array=(${(s::)string})
printf '<%s>\n' $array
(обратите внимание, что индексы массива в zsh
начинаются с 1, как в большинстве других оболочек, а не с 0, как в bash
/ksh
).
Или сfish
(массивы также начинаются с 1):
set string WER
set array (string split '' $string)
printf '<%s>\n' $array
(предполагает, что $string
не содержит символов новой строки, хотя ).
POSIXly (оболочка POSIX имеет один массив:$@
(также начинается с 1 :$1
)), поэтому также будет работать в bash
или zsh
и стандарте вашей системыsh
:
string=WER
set --
while [ -n "$string" ]; do
tmp=${string#?}
set -- "$@" "${string%%"$tmp"}"
string=$tmp
done
printf '<%s>\n' "$@"
С csh
или tcsh
, которые вы, кажется, используете:
set string = WER
set array = "`printf '%s\n' $string:q | fold -w1`"
printf '<%s>\n' $array:q
Как и для fish
, предполагается, что строка не содержит символов новой строки. Также обратите внимание, что некоторые реализации fold
будут свертываться по байтам вместо символов, что означает, что это не будет работать должным образом, если строка содержит многобайтовые символы -.
После 1,5 минут исследований я могу ответить сам себе.
Решение состоит в том, чтобы использовать return вместо выхода. Таким образом, выход из функции не закрывает терминал, он оставляет сеанс оболочки открытым.