bash:检查两个变量是否都存在(也称为比较结果比较)

时间:2018-10-22 10:41:28

标签: 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命令的输出,什么都不输出,不输出退出状态。

很抱歉,如果这是重复的。我已经在这里和Google上搜索了一段时间,并且一定不能使用正确的术语。

1 个答案:

答案 0 :(得分:2)

如何?

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 manual列出了:+版本,但没有列出+版本。