shell 脚本中的比较
Comparisons in shell scripting
我真的很困惑。我想,我可以写一个 return 代码比较,如下所示。哪个更好?为什么会这样?
RC=$?
if [[ $RC == '0' ]]; then
if [ $RC -eq '0' ]; then
if [ $RC == '0' ]; then
if [ "$RC" == "0" ]; then
if [ "$RC" -eq "0" ]; then
if [[ "$RC" == "0" ]]; then
if (( "$RC" == "0" )); then
if ( "$RC" == "0" ); then
if (( $RC == 0 )); then
if ( $RC == 0 ); then
还有更多...
如果 RC="A"
-- 字符串怎么办?
如果您在 Bash
中,它不会按 类型 分隔其变量,但是 ... return
code
是数值,所以我将下注:
rc=$?
if (( ! rc )); then
# rc == 0
Do something
fi
原因:保持与预期相关的一致性 type
。
None 以上。在绝大多数情况下,您希望直接从 if
中检查退出代码。任何看起来像
的代码
command
RC=$?
if [ $RC == 0 ]; then
写得更优雅、更健壮、更地道
if command; then
除非您特别需要检查结果代码的精确非零值。
为了单独解决关于使用哪个比较运算符的问题,唯一完全可移植的变体是 [
和 =
。这个遗留 Bourne shell 运算符的语法不支持 ==
的相等性,所以这是错误的(尽管一些 shell 允许它作为语法安全网)。 -eq
运算符比较数字相等,而 =
执行字符串比较。
在现代的shell中,[[
和((
都是可行的,取决于你是否更关心字符串比较(这就是[[
有意义的地方)或算术(这是 ((
的域——如果比较涉及对数字的一些实际计算,则特别有用;但它绝对是更边缘的选择,因为它对字符串比较根本没有用)。 [[
还支持模式匹配,让你不再局限于静态字符串比较;与 [
不同,它需要双等号来进行字符串相等比较。它解决了 [
的一些棘手问题,包括但不限于使用破折号开头的未引号变量和参数的正确行为。
带单括号的替代方案根本无法满足您的要求。它尝试将 运行 $RC
作为子 shell.
中的命令
我真的很困惑。我想,我可以写一个 return 代码比较,如下所示。哪个更好?为什么会这样?
RC=$?
if [[ $RC == '0' ]]; then
if [ $RC -eq '0' ]; then
if [ $RC == '0' ]; then
if [ "$RC" == "0" ]; then
if [ "$RC" -eq "0" ]; then
if [[ "$RC" == "0" ]]; then
if (( "$RC" == "0" )); then
if ( "$RC" == "0" ); then
if (( $RC == 0 )); then
if ( $RC == 0 ); then
还有更多...
如果 RC="A"
-- 字符串怎么办?
如果您在 Bash
中,它不会按 类型 分隔其变量,但是 ... return
code
是数值,所以我将下注:
rc=$?
if (( ! rc )); then
# rc == 0
Do something
fi
原因:保持与预期相关的一致性 type
。
None 以上。在绝大多数情况下,您希望直接从 if
中检查退出代码。任何看起来像
command
RC=$?
if [ $RC == 0 ]; then
写得更优雅、更健壮、更地道
if command; then
除非您特别需要检查结果代码的精确非零值。
为了单独解决关于使用哪个比较运算符的问题,唯一完全可移植的变体是 [
和 =
。这个遗留 Bourne shell 运算符的语法不支持 ==
的相等性,所以这是错误的(尽管一些 shell 允许它作为语法安全网)。 -eq
运算符比较数字相等,而 =
执行字符串比较。
在现代的shell中,[[
和((
都是可行的,取决于你是否更关心字符串比较(这就是[[
有意义的地方)或算术(这是 ((
的域——如果比较涉及对数字的一些实际计算,则特别有用;但它绝对是更边缘的选择,因为它对字符串比较根本没有用)。 [[
还支持模式匹配,让你不再局限于静态字符串比较;与 [
不同,它需要双等号来进行字符串相等比较。它解决了 [
的一些棘手问题,包括但不限于使用破折号开头的未引号变量和参数的正确行为。
带单括号的替代方案根本无法满足您的要求。它尝试将 运行 $RC
作为子 shell.