Развернуть тесты
По сути, оболочка - это своего рода макроязык, или, по крайней мере, гибрид или какой-то еще. Каждая командная строка может быть в основном разбита на две части: часть анализа / ввода и часть расширения / вывода.
Первая часть - это то, на чем фокусируется большинство людей, потому что она самая простая: вы видите, что получаете. Вторая часть - это то, что многие избегают даже когда-либо пытаться понять очень хорошо, и именно поэтому люди говорят, что подобные вещи 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
.