WTH - 未找到命令 - if 语句 - bash 脚本

WTH - 未找到命令 - if 语句 - bash 脚本

我见过类似的帖子,其中由于 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

相关内容