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