bash:检查两个变量是否存在(即比较比较结果)



我正在编写一个bash脚本,有时会使用环境变量GIT_DIRGIT_WORK_TREE。 bash 脚本只有在两个变量都存在或都不存在的情况下才能正常运行。 如果有技术差异,则没有区别

这有效,但必须有更好的方法:

if [[ -z "${GIT_DIR}" ]]; then
_GIT_DIR_EXISTS=0
else
_GIT_DIR_EXISTS=1
fi 
if [[ -z "${GIT_WORK_TREE}" ]]; then
_GIT_WORK_TREE_EXISTS=0
else
_GIT_WORK_TREE_EXISTS=1
fi 
if [[ "${_GIT_DIR_EXISTS}" -ne "${_GIT_WORK_TREE_EXISTS}" ]]; then
echo "GIT_DIR is ${GIT_DIR}"
echo "GIT_WORK_TREE is ${GIT_WORK_TREE}"
echo "Both or none must exist"
exit 1
fi

我试过了:

if [[ (-z "${GIT_DIR}") -ne (-z "${GIT_WORK_TREE}") ]]; then

但这会产生此错误:

bash: syntax error in conditional expression
bash: syntax error near '-ne'

然后我求助于尝试半随机的东西,但有不同的错误:

if [[ -z "${GIT_DIR}" -ne -z "${GIT_WORK_TREE}" ]]; then
if [[ [-z "${GIT_DIR}"] -ne [-z "${GIT_WORK_TREE}"] ]]; then
if [[ [[-z "${GIT_DIR}"]] -ne [[-z "${GIT_WORK_TREE}"]] ]]; then
if [[ -z "${GIT_DIR}" ]] ^ [[ -z "${GIT_WORK_TREE}" ]]; then
if { [[ -z "${GIT_DIR}" ]] } -ne { [[ -z "${GIT_WORK_TREE}" ]] }; then
if [[ (( -z "${GIT_DIR}" )) -ne (( -z "${GIT_WORK_TREE}" )) ]]; then

我试过了:

if [[ $(test -z "${GIT_DIR}") -ne $(test -z "${GIT_WORK_TREE}") ]]; then

但意识到这是行不通的,因为它是一个子流程,需要导出它们。 正如 Socowl 所评论的那样,这比较了不输出任何内容的test命令的输出,而不是它们的退出状态。

如果这是重复的,我深表歉意。 我在这里搜索了一段时间,谷歌搜索了一段时间,一定没有使用正确的术语。

这个怎么样:

if [[ "${GIT_DIR:+set}" != "${GIT_WORK_TREE:+set}" ]]; then
echo "GIT_DIR is '${GIT_DIR}'"
echo "GIT_WORK_TREE is '${GIT_WORK_TREE}'"
echo "Both or none must exist"
exit 1
fi

说明:${var:+value}是参数扩展的一种变体,如果var设置为非空字符串,则给出"value",如果未设置或为空,则给出空字符串var。因此,如果两个变量都未设置/为空,则变为if [[ "" != "" ]]; then,如果它们都已设置,则变为if [[ "set" != "set" ]]; then等。

顺便说一句,如果您想测试变量是否被设置(即使是空字符串(,请使用${var+value}(注意缺少冒号(。bash 手册列出了:+版本,但没有列出+版本。

最新更新