【问题标题】:Stuck on if or loop [duplicate]卡在if或循环上[重复]
【发布时间】:2021-05-11 12:37:18
【问题描述】:

我正在为我的 Linux 制作一个 bash 脚本。但我被困在 if 或循环上。如果我选择是,那就是spamming ==yes

 echo "Found a previously saved file. Do you want to continue with this? (Yes/No)"
    read Response
if [["$Response" == "Yes" || "$Response" == "yes" || "$Response" == "y" || "$Response" == "Y"]]; then
    echo "Success" 
    else
    echo "Fail"
    fi

【问题讨论】:

  • 什么循环?您的代码中没有循环。
  • @user1934428 然而,它确实循环了。
  • 您可以将其简化为[[ $Response = [yY]?(es) ]]
  • 您发布的代码 sn-p 无法循环。
  • @user1934428 我在答案中添加了对循环行为的解释。

标签: bash loops if-statement kali-linux


【解决方案1】:

[[" 之间以及 "]] 之间需要一个空格。使用[[]] 进行测试时,您还可以在字符串周围放置" - 但要留出空间。否则,bash 会这样做:

[[yes == Yes

响应:

[[yes: command not found...

|| 让它尝试下一部分,在这里它执行成为“神奇”循环的命令:

yes == yes

yes 实际上是一个命令,它将重复您作为参数给出的内容(它默认为y 能够执行yes | program 以回答programy 提出的所有问题)。它将继续重复同样的事情,直到关闭stdout(接收器关闭stdin)。

所以,它会不断地打印== yes

修复:

#!/bin/bash

echo "Found a previously saved file. Do you want to continue with this? (Yes/No)"
read -r Response

if [[ $Response == Yes || $Response == yes || $Response == y || $Response == Y ]]; then
    echo "Success" 
else
    echo "Fail"
fi

【讨论】:

  • 可能这里不需要双引号,但有时会发生参数为空 - 然后$x = yes可能会变成` = y`,这不是一个有效的表达式。
  • @CiaPan 不,不是[[ / ]] - 你在想[ / ]。试试看:if [[ $empty1 == $empty2 ]]; then(两者都是空的,甚至是未定义的)。
  • 谢谢@Ted!你让我意识到我在错误的生活中度过了美好的时光。幸运的是,没有不良后果! :D
  • @CiaPan 不客气! :-D
  • 当然,case 语句在这里会更加优雅和惯用。
猜你喜欢
  • 1970-01-01
  • 2014-01-07
  • 1970-01-01
  • 2021-10-03
  • 1970-01-01
  • 1970-01-01
  • 2018-10-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多