寻找一种声明布尔值的方法,如下所示:
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
。