Я ищу способ, чтобы произошел кризис, основанный на условии if в условии case в bash. Например:
input="foo"
VAR="1"
case $input in
foo)
if [ $VAR = "1" ]; then
# perform fallthrough
else
# do not perform fallthrough
fi
;;
*)
echo "fallthrough worked!"
;;
esac
В приведенном выше коде, если переменная VAR
есть 1
, я бы хотел, чтобы условие case выполняло падение.
bash
shell-script
case
Smashgen
источник
источник
if [ $VAR -eq 1 ]; then
части кода к тому, что находится внутри*)
? Потому что это полностью отличается от того, что называется «прорыв», что делает ваш вопрос формулировочным, слегка вводящим в заблуждение.Ответы:
Ты не можешь Способ
case
провалиться - заменить;;
разделитель на;&
(или;;&
). И это синтаксическая ошибка, чтобы поместить это в if.Вы можете написать всю логику как обычное условие:
источник
if
.Я бы предложил реструктурировать вашу логику: вместо этого поместите «сквозной» код в функцию:
выходы
источник
Следующий скрипт выворачивает ваш тест "наизнанку" в том смысле, что мы
$var
сначала тестируем, а затем выполняем анализ (используя;&
в acase
) в зависимости от$input
.Мы делаем это потому, что вопрос о том, стоит ли «выполнять прорыв», действительно зависит только от «
$input
если$var
есть»1
. Если это какая-то другая ценность, вопрос о том, стоит ли делать прорыв, даже не нужно задавать.Или без
case
:источник
*)
. Уже есть мой +1.Не то, что я бы сделал, но вы могли бы достичь чего-то, связанного с:
источник
Проверьте обе переменные одновременно (bash 4.0-alpha +):
На тестировании:
Чисто и просто.
Поймите, что проверяемое значение (
$new
) должно иметь только два возможных значения, поэтому есть предложение if, чтобы преобразовать VAR в логическое значение. Если VAR может быть задан как логическое значение, то проверьте0
(не1
) вcase
и удалитеif
.источник
Вы можете сделать сквозной режим по умолчанию, но поставить условие, что код будет выполняться только в том случае, если условие выполнено
Но, как предложил ilkkachu, вы также можете использовать условия, а не переключаться.
источник
Если вы не возражаете против того, чтобы кто-то жаловался на то, что он не понимает ваш код, вы можете просто изменить порядок двух условий:
Или:
Просто и понятно (по крайней мере для меня).
case
не поддерживает само падение. Но вы можете заменить*)
на&&
after,esac
чтобы относиться к возвращаемым значениям других ветвей.источник
Новые операторы
;&
и;;&
операторы были введены вBash
4.0, и хотя они оба могут быть полезны в аналогичных ситуациях, я думаю, что они бесполезны в вашем случае. Вот чтоman bash
говорит об этих операторах:Другими словами,
;&
это падение до конца и , как мы знаем изC
и;;&
маркиbash
проверить остальных случаях вместо возвращения изcase
блока целиком. Вы можете найти хороший пример;;&
в действии здесь: /programming//a/24544780/3691891 .Это, как говорится, ни то,
;&
ни другое не;;&
может быть использовано в вашем сценарии, потому что оба они пойдут на*)
то, что всегда будет выполняться.Следующий скрипт работает и делает то, что вы хотите, не перестраивая логику, но рассматривайте это только как пример и никогда не полагайтесь на него, он слишком хрупок. Я взял идею отсюда :
источник
jumpto
функции и выполняет все, что следует после нее. Тот факт, что это эквивалентно продолжению выполнения после блока междуft:
и;;
является совпадением, посколькуjumpto
является последней командой в той же сложной команде, что и блок, к которому был выполнен переход.