我正在编写一个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
命令的输出,而不是它们的退出状态。
如果这是重复的,我深表歉意。 我在这里搜索了一段时间,谷歌搜索了一段时间,一定没有使用正确的术语。
这个怎么样:
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 手册列出了:+
版本,但没有列出+
版本。