Какая команда означает "ничего не делать" в условном выражении в BASH?

Иногда при выполнении условий мне нужен код, который ничего не делает, например, здесь я хочу, чтобы BASH ничего не делал, когда $a больше, чем "10", печатать "1", если $a меньше, чем "5", в противном случае напечатайте "2":

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

Это делает ошибку, хотя. Есть ли команда, которая ничего не сделает и которая не замедлит мой script?

Ответ 1

Команда no-op в оболочке : (двоеточие).

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

В bash manual:

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

Ответ 2

Возможно, вы просто можете использовать команду 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

Ответ 3

Несмотря на то, что я не отвечаю на исходный вопрос, задающий команду no-op, многие (если не большинство) проблемы, когда можно подумать, что "в этой ветке я ничего не должен делать", можно обойти просто реструктурировать логике, чтобы эта ветвь не встречалась.

Я пытаюсь дать общее правило, используя пример OP

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

нам нужно избегать ветки, где $a получает больше 10, поэтому $a < 10 как общее условие может быть применено к каждому другому, следуя условию.

В общих чертах, когда вы говорите ничего не делаете, когда X, а затем перефразируйте его как , избегайте ветки, где X. Обычно вы можете избежать этого, просто отрицая X и применяя его ко всем другим условиям.

Таким образом, пример OPs с применяемым правилом может быть изменен как:

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 реструктуризация, конечно, лучше, но я хотел дать общее правило для всех людей, которые ищут, как ничего не делать.)