编辑:我最初认为这是一个范围问题。我已更新标题以反映实际问题。
我在下面创建了一个 MRE
#!/bin/bash
while getopts a OPTION
do
case ${OPTION} in
a)
echo "archive case"
ARCHIVE=true
;;
?)
echo "error"
;;
esac
done
if [[ "${ARCHIVE}" -eq true ]]
then
echo "it's archived"
else
echo "It's not archived"
fi
当我运行“./script.sh”时,我得到返回值“已存档”,但是当我运行“./script.sh -a”时,输出显示“存档案例”和“已存档”。
有人能告诉我这里发生了什么事吗?如果 case 语句有效,为什么还要创建 ARCHIVE 变量?
感谢您的帮助。
答案1
这里的问题不是范围界定——[[ "${ARCHIVE}" -eq true ]]
而是算术测试,并且很可能两个字符串${ARCHIVE}
和true
都在算术上评估为零。
您可能想要[[ "${ARCHIVE}" == true ]]
- 尽管请注意 LHS 上的双引号并不是严格必要的,请参阅什么时候需要双引号?。
也可以看看条件结构:[[...]]。