如何在bash中构建条件赋值?

时间:2010-03-14 02:13:50

标签: bash

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

在Java中它看起来像这样:

int variable= (condition) ? 1 : 0;

8 个答案:

答案 0 :(得分:58)

如果要在shell脚本中定义默认值,请使用以下代码:

: ${VAR:="default"}

是的,该行以':'开头。我在shell脚本中使用它,所以我可以覆盖ENV中的变量,或使用默认值。

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

答案 1 :(得分:49)

根据乔纳森的评论:

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

编辑:

我修改了原来的答案,只是echo'条件运算符的值,它实际上没有显示任何赋值。

答案 2 :(得分:23)

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

真实的例子:

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

条件可以是“((...))”:

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

答案 3 :(得分:17)

除了其他更一般的答案(特别是根据Jonathan的comment和Kevin的more general answer [也支持字符串]),我想添加以下两个解决方案:


根据条件将变量设置为01

(正如问题的例子所示。)

一般表格会读取

(condition); variable=$?;

其中$variable导致01condition可以是任何有效conditional expression

E.g。检查变量......

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

...或检查文件的存在......

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

...或检查$myNumber的数值:

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


此解决方案的优点是


请注意:在Bash中,特殊变量$?始终包含先前执行的语句的退出代码(或语句块;有关详细信息,请参阅man bash)。因此,正面结果通常由值0表示,而不是1(请参阅我的评论below,感谢Assimilater pointing it out)。因此,如果条件为真(例如[[2 eq 2]]),则$?=0

如果您在变量中需要0或1(例如打印或进行数学计算),则需要使用前导感叹号(如下面comments中的GypsySpellweaver所指出的那样)使用布尔否定: ( ! condition ); variable=$?! ( condition ); variable=$?。 (但是,就发生的事情而言,可读性可能不太明显。)

Jonathan的另一个可能的solution将是variable=$(( 1 == 1 ? 1 : 0 )) - 但是,它正在创建一个子shell。

如果您想避免创建subhel,保持良好的可读性或具有任意条件,请使用以下解决方案之一。


将变量设置为任意值:

正如大多数其他答案所做的那样,它可以改编如下:

(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

(对于最后一个例子, - 正如上面的注释中已经提到的那样 - 使用带有感叹号的布尔否定可以实现相同的目的:

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


此解决方案的优点是

  • 与Kevin answer myvar="default" && [[ <some_condition_is_true> ]] && myvar="non-default"
  • 相比,它可能被认为有点更易读/
  • $valueIfTrue有条件评估如果需要,这对于你做某件事情很重要
    • 有副作用,比如
      • variable=$((i++))
      • { variable=$1; shift; }
    • 高计算,就像
      • variable=$(find / -type f -name ListOfFilesWithThisNameOnMySystem)
  • 有点更短而不是ghostdog74的answer
    (如果你有多个条件,那就很棒了!)
  • 不会像皮埃尔的answer
  • 那样打开子shell
  • 和上面一样:

答案 4 :(得分:8)

我想用字符串进行条件赋值,最后得到:

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

答案 5 :(得分:6)

Big ups 到@Demosthenex,尤其是@Dennis Williamson,我看到了最短,最简单的解决方案。 将其保留为bash ,需要一堆括号来进行简单的三元分配。 啊,60年代!并将它们放在一个例子中......

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
  

$OTHERSDKiphoneos

答案 6 :(得分:4)

如果要分配值,除非变量为空,请使用:

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

您也可以在[]

上添加其他条件

答案 7 :(得分:3)

另一种方式

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