我见过类似的帖子,其中由于 if 语句中的空格错误而引发“未找到命令”错误。
我找不到空白错误。他们在哪里?还能是什么?
基本上,如果我在没有标志的情况下运行 test.sh (如下),终端就会开始喊出粗鲁的脏话,例如“找不到命令”。如果我使用标志,效果会很好。我不想一直用旗帜贿赂 bash。这对它的长期健康不利。
这是在测试文件:
verbose='false'
aflag=''
bflag=''
sflag=''
files=''
while getopts 'absf:v' flag; do
case "${flag}" in
a) aflag='true';;
b) blag='true' ;;
s) sflag='true' ;;
f) files="${OPTARG}" ;;
v) verbose='true';;
*) error "Unexpected option ${flag}" ;;
esac
done
# ======= Below this is where the error gets thrown
if "$sflag" ;
then
echo "okay" ;
fi
# ======= end error throwing code
echo "end" # this prints just fine
我运行上面的脚本
$ bash test.sh
然后我回来
test.sh: line 17: : command not found
end
有人可以给我一些关于如何说服 bash 理性行事的建议吗?
我使用的是 Mac(我不知道这是否有影响)。
答案1
错误是您没有传递任何标志,因此整个while getopts
循环永远不会运行,您的$sflag
循环仍然为空,因此 bash 实际运行的是:
if ""; then echo "okay" ; fi
最简单的解决方案是将变量初始化为 false:
verbose='false'
aflag='false'
bflag='false'
sflag='false'
files='false'
while getopts 'absf:v' flag; do
case "${flag}" in
a) aflag='true';;
b) blag='true' ;;
s) sflag='true' ;;
f) files="${OPTARG}" ;;
v) verbose='true';;
*) error "Unexpected option ${flag}" ;;
esac
done
# ======= Below this is where the error gets thrown
if "$sflag" ;
then
echo "okay" ;
fi
# ======= end error throwing code
echo "end" # this prints just fine