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

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

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

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

3 ответов


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

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

С руководство bash:

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


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

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

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

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

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