Тернарный оператор (?:) в 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
на cond && op1 || op2
выражение, предложенное в других ответах, имеет неотъемлемую ошибку: if op1
имеет ненулевой статус выхода op2
молча становится результатом; ошибка также не будет поймана в -e
режим. Таким образом, это выражение безопасно использовать только если op1
никогда не может потерпеть неудачу (например, :
, true
если встроенное или переменное назначение без каких-либо операций, которые могут завершиться неудачей (например, разделение и вызовы ОС)).
Примечание ""
цитаты. Первая пара предотвратит синтаксическая ошибка если $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"`
можно использовать следующие три способа в сценарии оболочки для тернарного оператора :
[ $numVar == numVal ] && resVar="Yop" || resVar="Nop"
Or
resVar=$([ $numVar == numVal ] && echo "Yop" || echo "Nop")
Or
(( numVar == numVal ? (resVar=1) : (resVar=0) ))