Що команда означає "нічого не робити" в умовному режимі в Bash?


180

Іноді, створюючи умовні умови, мені потрібен код, щоб нічого не робити, наприклад, тут я хочу, щоб Bash нічого не робив, коли $aбільший за "10", надрукувати "1", якщо $aменше "5", інакше надрукуйте "2":

if [ "$a" -ge 10 ]
then
elif [ "$a" -le 5 ]
then
    echo "1"
else
    echo "2"
fi

Однак це робить помилку. Чи є команда, яка нічого не зробить, а також не сповільнить мій сценарій?

Відповіді:


340

Команда без операції в оболонці - це :(двокрапка).

if [ "$a" -ge 10 ]
then
    :
elif [ "$a" -le 5 ]
then
    echo "1"
else
    echo "2"
fi

З посібника з bash :

:(двокрапка)
Не робіть нічого, крім розширення аргументів та виконання переадресацій. Статус повернення дорівнює нулю.


3
@SaintHax Ні, він не працює true. Він вбудований в оболонку, і нічого не робить.
Бармар

1
це вбудована оболонка (ви маєте рацію), вона повертає істину (статус 0), як і справжнє, і це важче читати. Bash - це мова DevOps, і якщо :її написав хтось із моєї команди, я б змусив їх змінити її.
SaintHax

3
@SaintHax Якщо хтось використовував trueу неумовному контексті, я б змусив їх змінити його. if trueдобре, then trueздається неправильним.
Бармар

1
Звичайно, ви можете просто переписати код на використання if ! condition; then do something; fiзамість if condition; then :; else do something; fi.
Бармар

Я погоджуюсь з тобою. Цей приклад можна написати, якщо / elif / else, використовуючи складні умови і було б краще.
SaintHax

38

Можливо, ви можете просто скористатися trueкомандою:

if [ "$a" -ge 10 ]; then
    true
elif [ "$a" -le 5 ]; then
    echo "1"
else
    echo "2"
fi

Альтернативою у вашому прикладі (але не обов'язково скрізь) є повторне замовлення на if / else:

if [ "$a" -le 5 ]; then
    echo "1"
elif [ "$a" -lt 10 ]; then
    echo "2"
fi

8
Якщо ви не тестуєте результат обох trueі falseфактично не спрацьовуєте, що стосується сценарію, але, в принципі, вони могли б розщедритися в деяких оболонках, які приймають цей синтаксис, так що, можливо :, краще.
dmckee --- кошеня колишнього модератора

3
Питання позначено тегом bash. В bash, trueі falseвбудовані. Для більш старих оболонок, true, falseі навіть :може бути зовнішні команди (хоча ви, ймовірно , побачити останній тільки в дуже старих оболонок).
Кіт Томпсон

6
Я віддаю перевагу :просто тому, що
явніше,

9

Хоча я не відповідаю на первісне запитання, що стосується команди no-op, але багато (якщо не більшість) проблем, коли можна думати " в цій галузі я нічого не повинен робити ", можна обійти простою структурою логіки, щоб ця гілка перемогла не трапляються

Я намагаюся дати загальне правило, використовуючи приклад ОП

не робіть нічого, коли $ a більше "10", надрукуйте "1", якщо $ a менше "5", інакше надрукуйте "2"

ми повинні уникати гілки, де $aотримує більше 10, тому $a < 10загальна умова може бути застосована до будь-якої іншої, наступної умови.

У загальних рисах, коли ви говорите , нічого не робити , коли X , то перефразувати як уникнути гілки , де X . Зазвичай ви можете зробити уникнення, просто відкинувши X і застосувавши його до всіх інших умов.

Отже, приклад ОП із застосованим правилом може бути реструктурований як:

if [ "$a" -lt 10 ] && [ "$a" -le 5 ]
then
    echo "1"
elif [ "$a" -lt 10 ]
then
    echo "2"
fi

Просто варіація вищезазначеного, що охоплює все в $a < 10умові:

if [ "$a" -lt 10 ]
then
    if [ "$a" -le 5 ]
    then
        echo "1"
    else
        echo "2"
    fi
fi

(Для цього конкретного прикладу реструктуризація @Flimzys , безумовно, краща, але я хотів дати загальне правило для всіх людей, які шукають, як нічого не робити.)


5
Однією з причин, коли хтось може захотіти відмовитись, є спочатку структурування коду з думкою, що додати «додати щось тут пізніше», не маючи випадкових побічних ефектів. Наприклад, якщо ви ставите if-then-else-fi в .bashrc, якщо ви покладете, echo "put stuff here"він порушить деякі з невхідних даних (наприклад, scp зламається), і лише пробіли / коментарі викликають помилку виконання.
Афоїд
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.