Тернарный оператор (?:) в bash


есть ли способ сделать что-то подобное

int a = (b == 5) ? c : d;

С помощью Bash?

13 285

13 ответов:

тернарный оператор ? : - это просто короткая форма if/else

case "$b" in
 5) a=$c ;;
 *) a=$d ;;
esac

или

 [[ $b = 5 ]] && a="$c" || a="$d"

код:

a=$([ "$b" == 5 ] && echo "$c" || echo "$d")

если условие просто проверяет, установлена ли переменная, есть даже более короткая форма:

a=${VAR:-20}

будет назначить a значение VAR Если VAR установлен, в противном случае он присвоит ему значение по умолчанию 20 -- это также может быть результатом выражения.

как отмечает Алекс в комментарии, этот подход технически называется "расширение параметров".

(( a = b==5 ? c : d )) # string + numeric
if [ "$b" -eq 5 ]; then a="$c"; else a="$d"; fi

The cond && op1 || op2 выражение, предложенное в других ответах, имеет врожденную ошибку: if op1 имеет ненулевой статус выхода 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;

естественно, это работает только для назначения переменных; он не может выполнять другие команды.

(ping -c1 localhost&>/dev/null) && { echo "true"; } || {  echo "false"; }

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

примеры

$ 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 "" "" ""

вы можете использовать это, если вы хотите подобный синтаксис

a=$(( $((b==5)) ? c : d ))

вот несколько вариантов:

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) ))