shell命令行变量 如何在bash中构建条件赋值?



shell中 (7)

对于@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

$OTHERSDK iphoneos

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

在Java中它看起来像这样:

int variable= (condition) ? 1 : 0;

Answer #1

其他方式

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

Answer #2

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

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

Answer #3

如果您想要一种在shell脚本中定义默认值的方法,请使用以下代码:

: ${VAR:="default"}

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

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


Answer #4

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

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

你也可以在[]上加上其他条件


Answer #5

根据乔纳森的评论:

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

编辑:

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


Answer #6

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


根据条件将变量设置为01

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

一般形式会读

(condition); variable=$?;

其中$variable导致01condition可以是任何有效的条件表达式

例如检查变量......

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

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

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

...或检查$myNumber数值:

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


这种解决方案的优点是

  • 它支持任意条件表达式 ,包括字符串
    (Jonathan comment 算术表达式不支持)
  • 在任何情况下都会声明variable ,这与griffon的answer :
    [ -z "$variable" ] && variable="defaultValue"
    如果您想稍后将其nameref为(例如,在函数内),这将很重要。


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

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

Jonathan的另一个可能的commentvariable=$(( 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=$?


这种解决方案的优点是

  • 它可能被认为比凯文的答案 更具可读性
    myvar="default" && [[ <some_condition_is_true> ]] && myvar="non-default"
  • 在需要时有条件地评估$valueIfTrue
    如果你做某事就很重要
    • 有副作用,比如
      • variable=$((i++)) ,或
      • { variable=$1; shift; }
    • 高计算,如
      • variable=$(find / -type f -name ListOfFilesWithThisNameOnMySystem)
  • 比ghostdog74的answer略
    (如果你有多个条件,这是很棒的!)
  • 不像皮埃尔的answer那样打开子壳
  • 如上:
    • 它支持任意条件表达式 ,包括字符串
      (Jonathan comment 算术表达式不支持)
    • 在任何情况下都会声明variable ,这与griffon的answer :
      [ -z "$variable" ] && variable="defaultValue"
      如果您想稍后将其nameref为(例如,在函数内),这将很重要。




bash