сценарии оболочки bash: объединение условных строк

#bash #scripting #raspberry-pi #debian

Вопрос:

Я хочу условно отправить текст в другой сценарий оболочки. Это означает, что я хочу заменить «ПРЕДУПРЕЖДЕНИЕ» в случае, если deb=1, на «ИНФОРМАЦИЯ».:

 #!/usr/bin/env bash ... if [[ $abc -lt 98 ]] || [[ $deb -eq 1 ]] then   ./discord.sh --webhook-url=$url --text "WARNING: $abc" fi  

Я также хочу избежать еще одного полного утверждения IF. Я ожидаю, что у меня будет что-то вроде

 deb=1 ? "INFO" : "WARNING"  

Это работает? Если да, то как будет выглядеть полное заявление? «…сообщение …»

Заранее спасибо.

Ответ №1:

Можно сделать с помощью индекса массива, чтобы сопоставить числовой уровень журнала со строкой имени:

 #!/usr/bin/env bash  url=https://example.com/hook  logLevel=(WARNING INFO)  for abc in 97 98; do  for deb in 0 1; do  printf 'abc=%d, deb=%d:n' $abc $deb  (((i = 1 == deb) || 98 gt; abc)) amp;amp;  echo ./discord.sh --webhook-url=$url --text "${logLevel[i]}: $abc"  done done  

Выход:

 abc=97, deb=0: ./discord.sh --webhook-url=https://example.com/hook --text WARNING: 97 abc=97, deb=1: ./discord.sh --webhook-url=https://example.com/hook --text INFO: 97 abc=98, deb=0: abc=98, deb=1: ./discord.sh --webhook-url=https://example.com/hook --text INFO: 98  

Комментарии:

1. э-э, довольно крутая идея. Большое спасибо!

2. if [[ $abc -lt 98 ]] || [[ $deb -eq 1 ]] верно, когда abc==100 и deb==1 . При исправлении удалите echo .

Ответ №2:

Ты имеешь в виду что-то вроде этого?

 [[ $abc -lt 98 ]] amp;amp; {  ./discord.sh --webhook-url=$url --text "$([[ $deb -eq 1 ]] amp;amp; echo "INFO" || echo "WARNING"): $abc"  }  

Подумайте об этом как об альтернативе if then else fi (фигурные скобки необходимы только в том случае, если у вас больше команд, но мне все равно нравится использовать их для удобства чтения (в некоторых случаях).

В основном это

[[ condition ]] amp;amp; { commands if true } || { commands if false }

Комментарии:

1. Когда abc==100 и deb==1 вы также хотите позвонить discord.sh

2. Да, это работает на меня: $([[ $deb -eq 1 ]] amp;amp; echo 'INFO' || echo 'WARNING')

3. Большое спасибо!

Ответ №3:

Не могли бы вы, пожалуйста, попробовать:

 if (( abc lt; 98 || deb == 1 )); then  loglevel=$( (( deb == 1 )) amp;amp; echo "INFO" || echo "WARNING" )  ./discord.sh --webhook-url=$url --text "$loglevel: $abc" fi  

Комментарии:

1. выглядит очень хорошо, спасибо!

2. Я забыл удалить echo команду для целей тестирования. Теперь исправлено.

3. Большое спасибо!

Ответ №4:

ИМХО, ответ @tshiono лучше всего. Однако становится трудно читать/отлаживать.
Почему бы не использовать подробное решение?
Если оба условия верны, вы хотите войти в систему с ИНФОРМАЦИЕЙ.

 if ((deb==1 )); then   ./discord.sh --webhook-url="$url" --text "INFO: $abc" elif ((abc lt; 98)); then  ./discord.sh --webhook-url="$url" --text "WARNING: $abc" fi