首页 > 解决方案 > if语句中的bash函数返回不起作用

问题描述

我正在尝试重构此代码:

if [ $(($1 % 4)) -eq 0 ] && [ $(($1 % 100)) -ne 0 ] || [ $(($1 % 400)) -eq 0 ] ; then
    echo $T
else
    echo $F
fi

变成这样的东西:

if divisibleBy4 && notDivisibleBy100 || divisibleBy400; then
    echo $T
else
    echo $F
fi

注意

T="true"
F="false"

divisibleBy4 函数如下所示:

divisibleBy4() {
    return  [ $(($1 % 4)) -eq 0 ]
}

但是我已经尝试了几次迭代,包括我认为肯定会起作用的方法。

divisibleBy4() {
    if [ $(($1 % 4)) -eq 0  ]; then
    return 1
    else return 0
    fi
}

知道如何正确修复语法,以便我可以将它们重构为函数并在我的 if 语句中使用它们吗?

测试时我看到错误

语法错误:预期操作数(错误标记为“% 4”)

我尝试过的另一件事是,但似乎仍然不起作用:

INPUT=$1

divisibleBy4() {
    if [ $(($INPUT % 4)) -eq 0  ]; then
         return 1
    else return 0
    fi
}

notDivisibleBy100() {
    if [ $(($INPUT % 100)) -ne 0]; then
         return 1
    else return 0
    fi
}

divisibleBy400() {
    if [ $(($INPUT % 400)) -eq 0  ]; then
         return 1
    else return 0
    fi
}


if divisibleBy4 && notDivisibleBy100 || divisibleBy400; then
    echo $T
else
    echo $F
fi

或者

INPUT=$1

divisibleBy4() {
    return $((!($INPUT %4)))
}
notDivisibleBy100() {
    return $(($INPUT %100))
}
divisibleBy400() {
    return $((!($INPUT %400)))
}

(( divisibleBy4 && notDivisibleBy100 || divisibleBy400 )) && echo "true" || echo "false"

标签: bash

解决方案


您想检测闰年!直接使用数学模式的完整其他解决方案:

a="$1"; (( !(a%4) && a%100 || !(a%400) )) && echo true || echo false

或者好像-那么-否则

a="$1";
if (( !(a%4) && a%100 || !(a%400) )); then
    echo true
else
    echo false

推荐阅读