Bash布尔表达式及其值赋值

sak*_*zai 20 bash

有没有办法评估布尔表达式并将其值赋给变量?

在大多数脚本语言中,有评估方法,例如

//PHS
$found= $count > 0 ;  //evaluates to a boolean values
Run Code Online (Sandbox Code Playgroud)

我想用类似的方式来评估bash:

BOOL=[ "$PROCEED" -ne  "y" ] ; 
Run Code Online (Sandbox Code Playgroud)

这不起作用,并尝试其他方式,但无法获得布尔值.有没有办法在没有使用IF的情况下这样做?

Mat*_*Mat 35

你可以这样做:

[ "$PROCEED" = "y" ] ; BOOL=$?
Run Code Online (Sandbox Code Playgroud)

如果您正在使用set -e,您可以使用:

[ "$PROCEED" = "y" ] && BOOL=0 || BOOL=1
Run Code Online (Sandbox Code Playgroud)

BOOL当匹配时设置为零,就像典型的Unix返回码一样.看起来有点奇怪.

这不会引发错误,并且您确定之后$BOOL将会是0或1,无论之前包含什么.

  • `-ne`和co.是"**算术**二元运算符"(`man bash`),不应该用于字符串.只需使用`=`. (3认同)

And*_*rew 16

我会建议:

[ "$PROCEED" = "y" ] || BOOL=1
Run Code Online (Sandbox Code Playgroud)

这有利于检查$?即使set -e打开也能正常工作.(请参阅编写健壮的shell脚本.)


小智 6

与其... && BOOL=0 || BOOL=1在当前接受的答案中使用建议,不如使用truefalse

并且由于这个问题是专门针对bash的(不是POSIX shell),因此最好使用[[代替[(参见12),后者允许使用==代替=

因此,如果您必须在bash中使用像这样的单行代码,则以下内容会更好:

[[ "$PROCEED" == "y" ]] && should_proceed=true || should_proceed=false

然后可以在布尔上下文中按人体工程学使用派生变量...

if $should_proceed; then
  echo "Proceeding..."
fi
Run Code Online (Sandbox Code Playgroud)

...包括!运营商:

if ! $should_proceed; then
  echo "Bye for now."
  exit 0
fi
Run Code Online (Sandbox Code Playgroud)


use*_*own 5

分配:

found=$((count > 0))
Run Code Online (Sandbox Code Playgroud)

  • 仅适用于算术测试。 (3认同)