Тернарный оператор (? :) в Баш - PullRequest
353 голосов
/ 17 октября 2010

Есть ли способ сделать что-то вроде этого

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

, используя Bash?

Ответы [ 14 ]

5 голосов
/ 22 октября 2010
(ping -c1 localhost&>/dev/null) && { echo "true"; } || {  echo "false"; }
3 голосов
/ 19 октября 2018

Существует также очень похожий синтаксис для троичных условных выражений в bash:

a=$(( b == 5 ? 123 : 321  ))

К сожалению, это работает только с числами - насколько я знаю.

3 голосов
/ 01 ноября 2017

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

a=$(( $((b==5)) ? c : d ))
2 голосов
/ 03 января 2017

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

1- Если возможно, то в одной строке это возможно.

if [[ "$2" == "raiz" ]] || [[ "$2" == '.' ]]; then pasta=''; else pasta="$2"; fi

2- Напишите такую ​​функцию:

 # Once upon a time, there was an 'iif' function in MS VB ...

function iif(){
  # Echoes $2 if 1,banana,true,etc and $3 if false,null,0,''
  case $1 in ''|false|FALSE|null|NULL|0) echo $3;;*) echo $2;;esac
}

используйте внутри скрипта, как это

result=`iif "$expr" 'yes' 'no'`

# or even interpolating:
result=`iif "$expr" "positive" "negative, because $1 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"`
...