在'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 ]
}
在基本'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 ]
}