![Когда выполняется цикл, начинающийся с while [ -n "$1" ];?](https://rvso.com/image/146500/%D0%9A%D0%BE%D0%B3%D0%B4%D0%B0%20%D0%B2%D1%8B%D0%BF%D0%BE%D0%BB%D0%BD%D1%8F%D0%B5%D1%82%D1%81%D1%8F%20%D1%86%D0%B8%D0%BA%D0%BB%2C%20%D0%BD%D0%B0%D1%87%D0%B8%D0%BD%D0%B0%D1%8E%D1%89%D0%B8%D0%B9%D1%81%D1%8F%20%D1%81%20while%20%5B%20-n%20%22%241%22%20%5D%3B%3F.png)
У меня есть скрипт оболочки с циклом while, начинающимся с
while [ -n "$1" ]; do
Я знаю, что это $1
относится к аргументу сразу после имени скрипта, т. е. firstargument
когда я выполняю ./myscript.sh firstargument
. Что они делают -n
?
решение1
Это -n
проверка на непустую строку.
Если "$1"
строка расширяется до пустой, то данный тест не пройден и цикл не будет выполнен.
Этовероятныйчто тело цикла содержит shift
оператор для сдвига следующего позиционного параметра в $1
, и что цикл таким образом перебирает аргументы скрипта, пока не найдет пустой аргумент или не дойдет до конца списка аргументов.
Утилита test
эквивалентна [
, но [
требует, чтобы последний аргумент был ]
.
Тест также можно записать как
while test -n "$1"; do
Оба [
они, test
скорее всего, встроены в вашу оболочку, но также должны быть доступны как внешние команды по стандартному пути, например /bin
.
Подробнее об этом и других тестах вы сможете прочитать в man test
, а также в руководстве к вашей оболочке (так как это встроенная утилита).
Этот -n
тест также является одним изстандартныйтесты и поэтому также перечислены встандарт POSIX для test
утилиты.
Еслиэтот цикл должен проходить по кругувсеаргументов скрипта оболочки, то он может не выполнить это, если аргумент пустой:
$ sh -c 'while [ -n "$1" ]; do printf "arg: %s\n" "$1"; shift; done' sh 1 2 3 "" 4 5 6
arg: 1
arg: 2
arg: 3
Вместо этого, возможно, следует использовать что-то вроде
for arg do
if [ -n "$arg" ]; then
# do something with "$arg"
fi
done
... в зависимости от того, что будет в сценарии, конечно.