gpt4 book ai didi

shell - 在bash shell中测试变量的感叹号是否为真

转载 作者:行者123 更新时间:2023-12-02 06:29:56 26 4
gpt4 key购买 nike

我知道在 shell 中感叹号可以反转条件的结果。在这里我想用它来测试变量是 true 还是 false 。

#! /bin/bash
bat=false
if [ ! $bar ]; then
echo 'bar is false'
else
echo 'bar is true'
fi

我期待'酒吧是假的'。然而结果是相反的。然后我使用“$bar”==“false”。这是正确的。

那么感叹号的使用技巧有哪些呢?当我们测试文件时,它只会反转结果吗?

最佳答案

tl;博士

[ ! $bar ]款待 $bar作为字符串,任何非空字符串都被认为是“真” - 包括文字 false ;换句话说:[ ! 'true' ] && [ ! 'false' ]两者都评估为“false”,因为在这两种情况下操作数都是非空字符串和 !否定结果。

因此,您必须使用字符串比较:

bar=false
if [ ! "$bar" = 'true' ]; then # same as: [ "$bar" != 'true' ]
echo 'bar is false'
else
echo 'bar is true'
fi

在 Bash 中,您还可以使用 [[ ! $bar == 'true' ]][[ $bar != 'true' ]] ;除非您需要保持 POSIX 兼容, I suggest using [[ ... ]] .

[ ... ] 的上下文中和 [[ ... ]] (特定于 Bash), 变量值默认为字符串 ,一般来说, 类似 POSIX 的 shell 没有明确的 bool 数据类型 .

一元运算符 !将其操作数隐式解释为 bool 值,并解释为 bool 上下文中的字符串 解释如下:
  • 只有一个 空字符串 被认为 “假” (退出代码 1(!))
  • 任何非空字符串 - 包括文字 false - 被认为 “真实” (退出代码 0(!))

  • 因此, ! $bar评估为“假”,因为 $bar - 包含非空字符串 'false' - 评估为“真”,并且 !反转那个。
    !也可以在条件之外使用来直接否定命令的成功状态(包括 [ )。
    falsetrue也作为命令名称存在(通常,作为 shell 内置函数),您可以执行以下操作,但请注意,它仅适用于文字 false 的变量值。或 true :
    bar=false
    if ! "$bar"; then
    echo 'bar is false'
    else
    echo 'bar is true'
    fi

    背景资料

    类似于 POSIX 的 shell 只有 2 种基本(标量)数据类型:
  • 字符串(默认):
  • [ ... ][[ ... ]]条件、运算符 = ( == 在 Bash 中) , < , <= , > , >=` 执行字符串比较。
  • 整数:
  • [ ... ][[ ... ]]条件、不同的算术运算符( -eqltlegtge )必须用于执行数值比较
  • 或者,在算术展开式 ( $(( ... )) ) 中, == , < , <= , > , >=有它们通常的数字含义。
    在 Bash 中,您还可以使用 (( ... ))作为算术条件。

  • 注意:根据 POSIX,您不能将变量键入为整数(因为无法声明 shell 变量),因此在使用算术运算符/在算术上下文中进行比较时,它只会被隐式视为一个。
    但是,在 Bash 中,您可以使用 declare -i 声明整数变量。/ local -i ,但在条件/算术上下文中,它仍然是运算符/算术上下文的选择,决定该值是被视为字符串还是整数。

    shell 中的 bool 值隐式表示为退出代码,与通常的 bool 到整数映射相反:
  • “true”映射到退出代码 0 (!)
  • "false"表示为退出代码 1 (!) 或任何其他非零退出代码。
  • 关于shell - 在bash shell中测试变量的感叹号是否为真,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41204576/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com