Когда выполняется цикл, начинающийся с while [ -n "$1" ];?

Когда выполняется цикл, начинающийся с while [ -n "$1" ];?

У меня есть скрипт оболочки с циклом 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

... в зависимости от того, что будет в сценарии, конечно.

Связанный контент