Если ваша строка не слишком длинная:
w='-w o rd baa'
w=${w//[!a-z]} # strip anything but lower case letters
eval echo '${w:'{0..10}':1}'
eval array=\( '${w:'{0..10}':1}' \)
echo "${array[@]}"
w o r d b a a
Вы можете превратить глупую вещь во что-то более неприятное, безопасное для IFS -и glob -, которое учитывает различия в относительном порядке фигурных скобок и расширений переменных между zsh
, bash
иksh
:
args(){ printf '<%s> ' "$@"; echo; }
w='-e a * () \n peek
fo*"x'"'q"
eval eval args "'\"\${w:'{0..$((${#w}-1))}':1}\"'"
eval eval 'array=\(' "'\"\${w:'{0..$((${#w}-1))}':1}\"'" '\)'
args "${array[@]}"
<-> <e> < > <a> < > <*> < > <(> <)> < > <\> <n> < > <p> <e> <e> <k> <
> < > <f> <o> <*> <"> <x> <'> <q>
Но, откровенно говоря, единственная польза от такого чудовища может заключаться в том, чтобы отпугнуть новичков и произвести впечатление на дураков предполагаемым глубоким знанием тонкостей языка оболочки;-)
2 и 3 не задействуют файловые системы, поэтому они не проходят через VFS.