如何在bash中构build一个条件赋值?

我正在寻找一种方法来在bash中构build条件赋值:

在Java中,它看起来像这样:

int variable= (condition) ? 1 : 0; 

根据乔纳森的评论:

 variable=$(( 1 == 1 ? 1 : 0 )) 

编辑:

我修改了原来的回答,只是echo了条件操作符的值,实际上并没有显示任何赋值。

如果您想要在shell脚本中定义默认值,请使用如下所示的代码:

 : ${VAR:="default"} 

是的,这行以':'开始。 我在shell脚本中使用这个,所以我可以在ENV中覆盖variables,或使用默认值。

这是相关的,因为这是我最常用的那种逻辑。 ]

 myvar="default" && [[ <some_condition_is_true> ]] && myvar="non-default" 

实例:

 DELIM="" && [[ "$APP_ENV_RESOLVED" != "" ]] && DELIM=$INNER_DELIM 

条件也可以是“((…))”:

 filepath=/proc/drbd && (( $# > 0 )) && filepath=$1 

到@Demosthenex,尤其是@Dennis Williamson,这是我见过的最简单,最简单的解决scheme。 让它为了简单的三元赋值而需要一堆括号六十年代啊 ! 并把它放在一个例子中…

 echo $BASHRULES; # not defined # no output : ${BASHRULES:="SCHOOL"} # assign the variable echo $BASHRULES # check it SCHOOL # correct answer : ${BASHRULES="FOREVER?"} # notice the slightly different syntax for the conditional assignment echo $BASHRULES # let's see what happened! SCHOOL # unchanged! (it was already defined) 

我很久以前写过这些日子了。这些日子里,我可能会对像…

 PLATFORM=iphonesimulator OTHERSDK=iphone && [[ $PLATFORM=~os ]] \ && OTHERSDK+=simulator \ || OTHERSDK+=os 

$OTHERSDK iphoneos

我想用string做一个有条件的分配,最后我得到:

 SOWHAT=$([ "$MYVALUE" = "value" ] && echo "YES" || echo "NO") 

除了其他更一般的答案(特别是根据乔纳森的评论和凯文的更一般的答案 [也支持string]),我想添加以下两个解决scheme:

根据条件将variables设置为01

(如问题的例子所示)。

一般forms将阅读

 (condition); variable=$?; 

$variable结果是01condition可以是任何有效的条件expression式 。

例如检查variables…

 [[ $variableToCheck == "$othervariable, string or number to match" ]] variable=$? 

…或检查文件的存在…

 [ -f "$filepath" ] fileExists=$? 

…或检查$myNumber的数字值:

 (( myNumber >= 1000000000 )) is_huge_number=$? 

这个解决scheme的优点是

  • 它支持任意的条件expression式 ,包括string
    (在Jonathan 解决scheme的 算术expression式中不支持)
  • 那个variable在任何情况下都被声明 ,不像griffon的答案 :
    [ -z "$variable" ] && variable="defaultValue"
    如果你想稍后进行名称引用 (例如在一个函数中),这将会很重要。

请注意:在Bash中,特殊variables$? 始终包含之前执行的语句(或语句块;请参阅man bash了解更多详细信息)的退出代码。 因此,一个积极的结果通常用0代表,而不是1 (见下面的评论,感谢Assimilater 指出 )。

因此,如果条件为真(例如[[2 eq 2]] ),那么$?=0 。 如果您的variables需要0或1(例如打印或进行math计算),那么您需要使用Jonathan的解决scheme variable=$(( 1 == 1 ? 1 : 0 )) ,或者 – 如果您想避免创build一个子shell或者有任意的条件 – 下面的解决scheme。

设置variables为任意值:

就像大多数其他答案中所做的那样,它可以进行如下调整:

 (condition) \ && variable=true \ || variable=false 

如在

 [[ $variableToCheck == "$othervariable, string or number to match" ]] \ && variable="$valueIfTrue" \ || variable="$valueIfFalse" 

或在正面检查中获得1,在失败时为0(如问题示例中所示):

 [[ $variableToCheck == "$othervariable, string or number to match" ]] \ && variable=1 \ || variable=0 

这个解决scheme的优点是

  • 这可能会被认为比凯文的答案 更好一些
    myvar="default" && [[ <some_condition_is_true> ]] && myvar="non-default" ,以及
  • $valueIfTrue 在需要$valueIfTrue进行条件评估
    如果你想做点什么,这很重要
    • 与副作用一样
      • variable=$((i++))或者
      • { variable=$1; shift; }
    • 高计算,就像
      • variable=$(find / -type f -name ListOfFilesWithThisNameOnMySystem)
  • 比ghostdog74的回答 一点
    (如果你有多个条件,这很好!)
  • 没有像皮埃尔的回答那样打开一个子壳
  • 和上面一样:
    • 它支持任意的条件expression式 ,包括string
      (在Jonathan 解决scheme的 算术expression式中不支持)
    • 那个variable在任何情况下都被声明 ,不像griffon的答案 :
      [ -z "$variable" ] && variable="defaultValue"
      如果你想稍后进行名称引用 (例如在一个函数中),这将会很重要。

如果你想分配一个值,除非variables是空的使用这个:

 [ -z "$variable" ] && variable="defaultValue" 

你也可以把对方的条件放在[]

其他方式

 case "$variable" in condition ) result=1;; *) result=0;; esac