Развернуть тесты
По сути, оболочка - это своего рода макроязык, или, по крайней мере, гибрид или какой-то еще. Каждая командная строка может быть в основном разбита на две части: часть анализа / ввода и часть расширения / вывода.
Первая часть - это то, на чем фокусируется большинство людей, потому что она самая простая: вы видите, что получаете. Вторая часть - это то, что многие избегают даже когда-либо пытаться понять очень хорошо, и именно поэтому люди говорят, что подобные вещи evalявляются злом, и всегда цитируют ваши расширения - люди хотят, чтобы результат первой части был равен первому. Это нормально - но это приводит к излишне длинным ветвям кода и множеству посторонних тестов.
Расширения проходят самотестирование . Эти ${param[[:]#%+-=?]word}формы более чем достаточно , чтобы проверить содержимое параметра, являются вложенностью, и все они основаны вокруг оценки для NUL - которая является то , что большинство людей ожидают тестов в любом случае. +особенно удобно в циклах:
r()while IFS= read -r r&&"${r:+set}" -- "$@" "${r:=$*}";do :;done 2>&-
IFS=x
printf %s\\n some lines\ of input here '' some more|{ r;echo "$r"; }
somexlines ofxinputxhere
... в то время как readтянет в не пустые строки "${r:+set}"расширяется "set"и позиционирование $rдобавляется. Но когда пустая строка read, $rпустой и "${r:+set}"расширяется ""- что является неправильной командой. Но так как командная строка расширяется до"" того ищется команда нуля, "${r:=$*}"принимают значения всех positionals сцепленной на первые байтах в $IFSа. r()может быть вызван снова в |{составной команде ;}с другим значением для того, $IFSчтобы получить также следующий входной абзац, так как для оболочки запрещено readбуферизовать после следующей \nстроки в вводе.
shи какая оболочка допускает этотforсинтаксис? это прямо разрешено вzsh.