Тернарный оператор (?:) в bash
есть ли способ сделать что-то подобное
int a = (b == 5) ? c : d;
С помощью Bash?
13 ответов:
тернарный оператор
? :
- это просто короткая формаif/else
case "$b" in 5) a=$c ;; *) a=$d ;; esac
или
[[ $b = 5 ]] && a="$c" || a="$d"
если условие просто проверяет, установлена ли переменная, есть даже более короткая форма:
a=${VAR:-20}
будет назначить
a
значениеVAR
ЕслиVAR
установлен, в противном случае он присвоит ему значение по умолчанию20
-- это также может быть результатом выражения.как отмечает Алекс в комментарии, этот подход технически называется "расширение параметров".
if [ "$b" -eq 5 ]; then a="$c"; else a="$d"; fi
The
cond && op1 || op2
выражение, предложенное в других ответах, имеет врожденную ошибку: ifop1
имеет ненулевой статус выходаop2
молча становится результатом; ошибка также не будет поймана в-e
режим. Таким образом, это выражение безопасно использовать только еслиop1
никогда не может потерпеть неудачу (например,:
,true
если встроенное или переменное назначение без каких-либо операций, которые могут завершиться неудачей (например, вызовы division и OS)).Примечание
""
цитаты. Первая пара предотвратит a синтаксическая ошибка если$b
пусто или имеет пробелы. Другие будут препятствовать переводу всех пробелов в отдельные пробелы.
[ $b == 5 ] && { a=$c; true; } || a=$d
Это позволит избежать выполнения части после || случайно, когда код между && и || не удается.
вот еще один вариант, где вам нужно только указать переменную, которую вы назначаете один раз, и не имеет значения, является ли ваше назначение строкой или числом:
VARIABLE=`[ test ] && echo VALUE_A || echo VALUE_B`
просто мысли. :)
на пусть команда поддерживает большинство основных операторов, которые понадобятся:
let a=b==5?c:d;
естественно, это работает только для назначения переменных; он не может выполнять другие команды.
следующее, кажется, работает для моих случаев использования:
примеры
$ tern 1 YES NO YES $ tern 0 YES NO NO $ tern 52 YES NO YES $ tern 52 YES NO 52 NO
и может быть использован в скрипте так:
RESULT=$(tern 1 YES NO) echo "The result is $RESULT"
крачка
function show_help() { echo "" echo "usage: BOOLEAN VALUE_IF_TRUE VALUE_IF_FALSE {FALSE_VALUE}" echo "" echo "e.g. " echo "" echo "tern 1 YES NO => YES" echo "tern 0 YES NO => NO" echo "tern "" YES NO => NO" echo "tern "ANY STRING THAT ISNT 1" YES NO => NO" echo "ME=$(tern 0 YES NO) => ME contains NO" echo "" exit } if [ "" == "help" ] then show_help fi if [ -z "" ] then show_help fi # Set a default value for what is "false" -> 0 FALSE_VALUE=${4:-0} function main { if [ "" == "$FALSE_VALUE" ]; then echo exit; fi; echo } main "" "" ""
вот несколько вариантов:
1-Используйте, если затем еще в одной строке, это возможно.
if [[ "" == "raiz" ]] || [[ "" == '.' ]]; then pasta=''; else pasta=""; fi
2-Напишите такую функцию:
# Once upon a time, there was an 'iif' function in MS VB ... function iif(){ # Echoes if 1,banana,true,etc and if false,null,0,'' case in ''|false|FALSE|null|NULL|0) echo ;;*) echo ;;esac }
использовать внутри скрипта такой
result=`iif "$expr" 'yes' 'no'` # or even interpolating: result=`iif "$expr" "positive" "negative, because is not true"`
3 - вдохновленный в случае ответа, более гибкой и одной линии использования является:
case "$expr" in ''|false|FALSE|null|NULL|0) echo "no...$expr";;*) echo "yep $expr";;esac # Expression can be something like: expr=`expr "$var1" '>' "$var2"`