声明布尔值的简写

声明布尔值的简写

寻找一种声明布尔值的方法,如下所示:

HOME_IS_BASE_DIR=$("home" == "${BASE_DIRECTORY}")    // boolean
USERS_IS_BASE_DIR=$("Users" == "${BASE_DIRECTORY}")   // boolean

当然,上面的方法不起作用,我收到一个错误:

bash 找不到 home 命令

bash 找不到用户命令

做到这一点的漫长方法是:

HOME_IS_BASE_DIR=false;
USERS_IS_BASE_DIR=false;

if [ "home" == "${BASE_DIRECTORY}" ]; then
  HOME_IS_BASE_DIR=true;
else if [  "Users" == "${BASE_DIRECTORY}" ]; then
  USERS_IS_BASE_DIR=true;
fi

有这个的简写吗?

答案1

可以通过以下方式实现更紧凑的表示

#!/bin/sh         
BASE_DIRECTORY="home";
[ "home" = "$BASE_DIRECTORY" ] && HOME_IS_BASE_DIR=true || HOME_IS_BASE_DIR=false;
echo $HOME_IS_BASE_DIR;

答案2

case ${BASE_DIRECTORY} in
    "home")
        HOME_IS_BASE_DIR=true
        USERS_IS_BASE_DIR=false
        ;;
    "Users")
        HOME_IS_BASE_DIR=false
        USERS_IS_BASE_DIR=true
        ;;
    *)
        # Handle heretofore unhandled values here
        ;;
esac

它不完全是速记,但它既非常清楚您在做什么,又很容易扩展到其他位置。不过,与其使用这些额外的变量,为什么不直接查看 ${BASE_DIRECTORY} 呢?

答案3

你要求类似的东西:

HOME_IS_BASE_DIR=$("home" == "${BASE_DIRECTORY}")
USERS_IS_BASE_DIR=$("Users" == "${BASE_DIRECTORY}")

您可以将测试变成函数:

HOME_IS_BASE_DIR()  { [[ "home"  == "${BASE_DIRECTORY}" ]]; }
USERS_IS_BASE_DIR() { [[ "Users" == "${BASE_DIRECTORY}" ]]; }

然后你可以做这样的测试:


BASE_DIRECTORY="/"

if HOME_IS_BASE_DIR        ; then echo "home is base dir"    ; fi
if ! HOME_IS_BASE_DIR      ; then echo "home is NOT base dir"; fi

if ! HOME_IS_BASE_DIR && \
   ! USERS_IS_BASE_DIR     ; then echo "neither is base dir" ; fi

# output of above:
# home is NOT base dir
# neither is base dir

# ...or use &&/|| instead of 'if':
BASE_DIRECTORY="Users"
USERS_IS_BASE_DIR && echo "Users is base dir"
HOME_IS_BASE_DIR  || echo "home is NOT base dir"

# output of above:
# Users is base dir
# home is NOT base dir

上面的代码适用于 bash 和 zsh,并且可以轻松地适用于 dash/POSIX。

解释

在 shell 脚本中,通常为退出代码( )等编写布尔表达式cmd1 && cmdd。这两个函数将生成与 中的测试相对应的退出代码[[ .. ]],因此我们可以在函数上形成布尔表达式。

请记住,每次测试完成时都会对函数进行评估,因此如果BASE_DIRECTORY更改,则任何带有 和 的测试的结果也会HOME_IS_BASE_DIR更改USERS_IS_BASE_DIR

相关内容