【问题标题】:Unix Bash If else statement not working [closed]Unix Bash If else 语句不起作用[关闭]
【发布时间】:2014-02-03 15:12:53
【问题描述】:

如果只使用 IF 条件,我可以在命令提示符下得到答案。 但是如果添加 elif ,命令提示符仍然是打开的并且没有结束...

我使用的代码...

-bash-3.00$ if [ "1" == "1" && "$cont" == "1" ]; then
> echo "I am if"
> elif [ "$cont" == "1"" ]; then
> echo "I am else"
> fi
>
>

预期输出:应该结束并返回回显;

【问题讨论】:

  • 你有一个错字。 elif [ "$cont" == "1"" ]; then一“太多了
  • elif 条件中 1 后面的双引号是故意的吗?
  • 虽然我改了,-bash: [: missing `]'
  • 你试过我建议的版本吗,@logan?
  • 请注意:“I am else”并不完全正确:else 涵盖了 elif 部分和该 elif 的 else 部分,但您仅在 elif 部分打印“I am else”。 .. 可以说“我是 elif”,它会更“真实”

标签: bash shell unix cmd


【解决方案1】:

您可以将&& 更改为-a

$ cont=1
$ if [ "1" = "1" -a "$cont" = "1" ]; then echo "ha"; fi
ha

或者使用两个单独的[ 命令:

$ if [ "1" = "1" ] && [ "$cont" = "1" ]; then echo "ha"; fi

或者使用双括号:

$ if [[ "1" == "1" && "$cont" == "1" ]]; then echo "ha"; fi
ha

还要注意 " 太多你在你的 elif 中,如 RedX comments

【讨论】:

  • 使用 Else if;我说,它仅适用于 IF ......仍然相同: -bash-3.00$ if [ "1" == "1" -a "$cont" == "1" ]; then > echo "I am if" > elif [ "$cont" == "1"" ]; then > echo "I am else" > else > echo "I am out" > fi > >
  • 他的代码中明显有错别字。
  • 投反对票的不是我。
  • 这是正确的,在其他错字被修复之后。由于&& 不被识别为[ 中的逻辑AND 运算符,但 一个shell 控制字符,它的存在将向bash 发出信号,表明前面的[ 命令缺少它的(愚蠢地)强制最后的]参数。
  • 我将您推荐给POSIX specification for the test command[ cond1 ] && [ cond2 ] 是推荐的与 POSIX 兼容的表达式(在已弃用的 [ cond1 -a cond2 ] 之上。[ cond1 && cond2 ] 只是无效。特定于字符串相等,= 仅是 POSIX 支持的运算符;== 是 @987654341 的扩展bash 也允许其内置实现 test 的 @ 命令;/usr/bin/test foo == foo 将产生错误。
【解决方案2】:

elif [ "$cont" == "1"" ]; then 无效;引号总是成对出现:

elif [ "$cont" == "1" ]; then

给你:

if [ "1" == "1" && "$cont" == "1" ]; then
echo "I am if"
elif [ "$cont" == "1" ]; then
echo "I am else"
fi

bash: [: missing ']' 失败

原因是第一行。您使用的是单个 [,这意味着 BASH 可以看到:

if [ "1" == "1"
pipe (&&)
"$cont" == "1" ]; then

试试

if [[ "1" == "1" && "$cont" == "1" ]]; then
echo "I am if"
elif [[ "$cont" == "1" ]]; then
echo "I am else"
fi

单个 [ 是 Bourne shell 时代的一个旧 错误功能。它们产生的各种问题都可以通过[[...]] 语法解决。

除非您知道自己在做什么,否则请避免使用单个 [ 和反引号语法(改用 $(cmd...))。

提示:要调试这样的事情,请使用 set -x 让 shell 打印它看到的每个命令。

【讨论】:

  • 虽然我改变了它。它说缺少`; -bash-3.00$ if [ "1" == "1" && "$cont" == "1" ];然后 > echo "我是如果" > elif [ "$cont" == "1" ];然后 > echo "I am else" > else > echo "I am out" > fi -bash: [: missing `]' I am out -bash-3.00$
  • @logan 最后一个引号和]之间有空格吗?
  • @chepner:是的,我有
  • @logan:查看我改进后的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 2015-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-05
相关资源
最近更新 更多