Как я могу использовать условные конструкции в операторе выбора удара?

Я должен проверить коды возврата двух нижних индексов, запущенных из сценария обертки, с помощью оболочки Bash.

Если любой нижний индекс перестанет работать, то они произведут отрицательное целое число как код возврата. Если сценарий будет иметь незначительные ошибки, то он произведет положительное целое число. Я выполнение совершенно успешно код возврата, буду 0.

Я хочу создать набор переменная, чтобы иметь содержание другой переменной на основе результата. В настоящее время я использую большое ужасное if elif создайте, но такое чувство, что я должен использовать a case оператор.

Вот мой текущий код:

if [[ "$sumcreate_retval" -lt "0" ]] && [[ "$movesum_retval" -lt "0" ]]
then
   script_retcode="$both_warn_err"
elif [[ "$sumcreate_retval" -gt "0" ]] && [[ "$movesum_retval" -gt "0" ]]
then
   script_retcode="$both_crit_err"
elif [[ "$sumcreate_retval" -gt "0" ]] && [[ "$movesum_retval" -lt "0" ]]
then
   script_retcode="$createwarn_movecrit_err"
elif [[ "$sumcreate_retval" -gt "0" ]] && [[ "$movesum_retval" -eq "0" ]]
then
   script_retcode="$createwarn_err"
elif [[ "$sumcreate_retval" -lt "0" ]] && [[ "$movesum_retval" -gt "0" ]]
then
   script_retcode="$createcrit_movewarn_err"
elif [[ "$sumcreate_retval" -lt "0" ]] && [[ "$movesum_retval" -eq "0" ]]
then
   script_retcode="$createcrit_err"
elif [[ "$sumcreate_retval" -eq "0" ]] && [[ "$movesum_retval" -gt "0" ]]
then
   script_retcode="$movewarn_err"
elif [[ "$sumcreate_retval" -eq "0" ]] && [[ "$movesum_retval" -lt "0" ]]
then
   script_retcode="$movecrit_err"
else
   script_retcode="$success_return"
fi

Как я должен реструктурировать это?

Примечание: Если этот вопрос лучше подходит для другого сайта SE, сообщенного мне.

1
задан 27 July 2016 в 15:22

2 ответа

Что-то вроде этого должно добиться цели. Я думаю, что это выглядит довольно хорошим этот путь:

case $((
  sumcreate_retval <  0 && movesum_retval <  0 ? 1 :
  sumcreate_retval >  0 && movesum_retval >  0 ? 2 :
  sumcreate_retval >  0 && movesum_retval <  0 ? 3 :
  sumcreate_retval >  0 && movesum_retval == 0 ? 4 :
  sumcreate_retval <  0 && movesum_retval >  0 ? 5 :
  sumcreate_retval <  0 && movesum_retval == 0 ? 6 :
  sumcreate_retval == 0 && movesum_retval >  0 ? 7 :
  sumcreate_retval == 0 && movesum_retval <  0 ? 8 : 
  0
)) in
  (1) script_retcode="$both_warn_err";;
  (2) script_retcode="$both_crit_err";;
  (3) script_retcode="$createwarn_movecrit_err";;
  (4) script_retcode="$createwarn_err";;
  (5) script_retcode="$createcrit_movewarn_err";;
  (6) script_retcode="$createcrit_err";;
  (7) script_retcode="$movewarn_err";;
  (8) script_retcode="$movecrit_err";;
  (0) script_retcode="success_return";;
esac
2
ответ дан 7 December 2019 в 12:38

Это похоже на ответ @imjoris, но я разбил математику. Это находится в троичном, где 0 0, 1 положительно, и 2 отрицательно по умолчанию. Я перестроил Ваш список для создания этого более ясным - надеются, что это не сбивает Вас с толку :-)

case $((
  sumcreate_retval == 0 ? 0 :
  sumcreate_retval >  0 ? 1 :
  2
  ))$((
  movesum_retval == 0 ? 0 :
  movesum_retval >  0 ? 1 :
  2
)) in
  00) script_retcode="$success_return" ;;
  01) script_retcode="$movewarn_err" ;;
  02) script_retcode="$movecrit_err" ;;
  10) script_retcode="$createwarn_err" ;;
  11) script_retcode="$both_crit_err" ;;
  12) script_retcode="$createwarn_movecrit_err" ;;
  20) script_retcode="$createcrit_err" ;;
  21) script_retcode="$createcrit_movewarn_err" ;;
  22) script_retcode="$both_warn_err" ;;
esac

BTW, StackOverflow является, вероятно, лучшим сайтом для сложных вопросов о сценариях как они.

1
ответ дан 7 December 2019 в 12:38

Другие вопросы по тегам:

Похожие вопросы: