我正在编写一个bash脚本,该脚本有时会使用环境变量GIT_DIR
和GIT_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上搜索了一段时间,并且一定不能使用正确的术语。
答案 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列出了:+
版本,但没有列出+
版本。