【问题标题】:Why is [ "$foo"=="$bar" ] always true in bash? [duplicate]为什么 [ "$foo"=="$bar" ] 在 bash 中总是正确的? [复制]
【发布时间】:2018-01-20 00:09:11
【问题描述】:

我试图将用户输入与字符串进行比较 这是我的代码

Encode="Encode"
Decode="Decode"

printf "Enter name of file: "
read fileName
printf "Encode Or Decode: "
read EncOrDec

if [ "$Encode"=="$EncOrDec" ]; then
    printf "Encode Nice\n"
elif [ "$Decode"=="$EncOrDec" ]; then
    printf "Decode Nice\n"
else
    printf "Nothing\n"
fi

它总是转到 Encode 语句,为什么? 以及如何解决它

【问题讨论】:

  • 这个问题会被shellcheck.net自动检测到;考虑在此处提问之前养成运行代码的习惯。
  • 顺便说一句,在尝试编写问题标题时,请尽量描述具体问题——即。不仅仅是“X的问题”,而是“为什么X在预期Z的时候做Y?”。我试图在这里为此进行编辑;这样人们就可以一眼看出他们是否有同样的问题(如果问题得到了回答),或者他们是否有可能提供帮助(如果没有)。

标签: bash string-comparison


【解决方案1】:

在 bash 中,空格很重要。替换:

if [ "$Encode"=="$EncOrDec" ]; then

与:

if [ "$Encode" = "$EncOrDec" ]; then

没有空格,bash 只是测试字符串"$Encode"=="$EncOrDec" 是否为空。因为它从不为空,所以总是执行then 子句。

另外,作为一个小细节,当使用[...] 时,使用= 进行字符串相等是POSIX 标准。 Bash 接受 ==,但 == 不是标准的,并且不能可靠地移植。

这同样适用于elif 行。替换:

elif [ "$Decode"=="$EncOrDec" ]; then

与:

elif [ "$Decode" = "$EncOrDec" ]; then

【讨论】:

    猜你喜欢
    • 2017-03-04
    • 1970-01-01
    • 2014-03-24
    • 2020-10-03
    • 1970-01-01
    • 2018-06-03
    • 2017-06-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多