在'sh'中如何将字符串比较的结果放入变量中?

In 'sh' how to put the result of a string comparison into a variable?

在基本'shell'中,如何将字符串比较的结果放入布尔变量中?

考虑:

isweekday() {
          w=$(date +%w)
          if [[ $w == "0" ]] || [[ $w == "6" ]]; then
                  false
          else
                  true
          fi

  }

人们可以争论它是否会更清楚,但是有没有办法将 'if' 表达式的结果分配给布尔变量,例如

isweekday() {
          w=$(date +%w)
          wd=<boolean result of [[ $w == "0" ]] || [[ $w == "6" ]]>
          return $wd
}

经过一些实验,我更接近我想要的,但它仍然不是我想要的:

isweekday() {
  w=$(date +%w)
  [[ $w == "0" ]] || [[ $w == "6" ]] 
}

这有效并且不需要条件,但它 看起来 错误,但是如果你这样做:

if isweekday; then
  echo 'weekday'
fi

你会得到正确的结果。这似乎是因为 'true' 的退出代码是 0 而 'false' 的退出代码是 1 (不太清楚为什么会这样......)

没有布尔变量。所有 shell 变量都是字符串(尽管将它们解释为用于基本比较等和基本算术的整数的工具有限)。

退出代码0为成功预留;所有其他退出代码(最大 255)表示错误(尽管一些非标准工具使用此工具通过约定方式传达 non-error 结果;然后假设调用者理解并同意此 ad-hoc 使用退出代码)。

对于您似乎要问的问题,也许最简单的答案就是保存退出代码。它暴露在变量 $? 中。但很多时候,您不需要明确地检查它的价值;事实上,你的最终 isweekday 代码看起来是迄今为止最惯用和自然的,而 returns 这段代码隐含地来自 [[

我不明白为什么你认为你的最终代码“看起来不对”;这正是您在条件语句中使用函数的方式。

然而,从某种意义上说,case 语句在这里看起来不那么混乱(但由于其他原因,这种语法一开始有点不和谐,直到你习惯它)。

is_weekday () {
    case $(date +%w) in
      0 | 6) return 1;;
    esac
    return 0
}

这与您使用的 Bash-only [[...]] 语法不同,可移植到 POSIX sh。或许还可以参见 Difference between sh and bash

Shell 中的标准方法是使用命令的退出代码作为 true/false 值,其中零表示 true,non-zero false。另外,我会改为定义一个函数来测试今天是否是周末,因为可以说这是例外。将 w 定义为局部变量并引用所有在一般情况下可能包含 space 或未定义的变量也是一个好主意,这可能导致变量扩展后的语法错误。这是我的建议:

IsWeekend()
{
    local w="$(date +%w)"
    [ "$w" = 0 ] || [ "$w" = 6 ]
}