if(比较 var1 var2)“var1 未找到”错误

Mon*_*_Lu 0 bash shell-script

我发现这个简单的 bash 可以说明我的问题:

  #!/bin/sh 
str1="Learn Bash"
str2="Learn Bash"

if (( "$str1" == "$str2" )); then
   echo "Both Strings are Equal."
else
   echo "Both Strings are not Equal."
fi 
Run Code Online (Sandbox Code Playgroud)

结果是:

    if_equal.sh: 6: if_equal.sh: Learn Bash: not found

Both Strings are not Equal.
Run Code Online (Sandbox Code Playgroud)

基本上我希望 if 将 awk 的结果与浮点数进行一次比较,然后与用户给出的整数进行比较,所以当我可以时,我使用

[ "$c" -gt "$o" ] 
Run Code Online (Sandbox Code Playgroud)

但它不适用于浮点数,我也不能使用第三个变量来循环它,如下所示:

[ "$c" -gt "$o" ] && echo fine || [ "$b" -gt "$o" ] && echo better
Run Code Online (Sandbox Code Playgroud)

我已经检查了所有空格,尝试使用和不使用“、[]、()、(())...我找不到为什么 if 发现第一个变量丢失。顺便说一句,我的脚本创建了一个文件“0.9500”因为我运行它

if (( "$c" > "0.9500" ))
Run Code Online (Sandbox Code Playgroud)

也许有解决方法?

Kus*_*nda 10

bash(( ... ))是算术评估。在shshell 中,即您的脚本由于 -line 而使用的 shell #!,它很可能被解释为两个嵌套的子 shell。这就是为什么当您使用shell0.9500运行时会得到一个被调用的文件。这是一个 I/O 重定向,而不是比较运算符,并且会被解释为命令,这就是导致“未找到”错误消息的原因。(( "$c" > "0.9500" ))sh>$c

shshell 中,如果要比较字符串,请使用

[ "$str1" = "$str2" ]
Run Code Online (Sandbox Code Playgroud)

如果您想比较整数,请使用,例如

[ "$num1" -gt "$num2" ]
Run Code Online (Sandbox Code Playgroud)

bashshell 中,你也可以使用上面的语法,但是你也可以使用

[[ "$str1" == "$str2" ]]
Run Code Online (Sandbox Code Playgroud)

比较两个字符串是否相等,以及

(( num1 > num2 ))
Run Code Online (Sandbox Code Playgroud)

比较两个整数。

shellbash不包含以字符串以外的任何其他方式处理浮点数的功能。

要在 shell 中比较浮点数,您可以使用awk.

if awk -v num1="$num1" -v num2="$num2" 'BEGIN { exit !(num1 > num2) }'
then
    printf '%s is greater than %s\n' "$num1" "$num2"
else
    printf '%s is not greater than %s\n' "$num1" "$num2"
fi
Run Code Online (Sandbox Code Playgroud)

请注意,比较的布尔结果必须反转,!才能将其转换为 shell 的退出状态。

有关的:


roa*_*ima 6

首先,sh不处理(( \xe2\x80\xa6 ))。您可以使用bash,但即使如此,它也仅适用于数字整数表达式。请参阅本答案后面的sh兼容使用awk。我注意到您将脚本描述为bash脚本,但您已将其用作#!/bin/sh标题。此标头将脚本声明为sh脚本,其语法略有不同。

\n

如果您正在使用,bash则应搜索文档 ( man bash) (((您可能需要转义括号,即\\(\\(,如果您的寻呼机需要它)。你会发现这段文字,

\n
\n

((expression))表达式根据下面算术评估下描述的规则进行评估。

\n
\n

向下搜索ARITHMETIC EVALUATION,你最终会读到这个(我的重点),

\n
\n

算术求值shell 允许在某些情况下对算术表达式求值(请参阅 和let内置declare命令、((复合命令和算术扩展)。评估以固定宽度整数完成,不检查溢出[...]

\n
\n

这告诉您该(( \xe2\x80\xa6 ))结构可以计算整数算术。它不适用于字符串或浮点运算。

\n

现在继续回答shbash

\n

您可以使用[ \xe2\x80\xa6 ]或处理字符串[[ \xe2\x80\xa6 ]]

\n
if [[ "$str1" == "$str2" ]] \xe2\x80\xa6    # bash\n
Run Code Online (Sandbox Code Playgroud)\n

或者

\n
if [ "$str1" = "$str2" ] \xe2\x80\xa6       # POSIX including sh, and bash\n
Run Code Online (Sandbox Code Playgroud)\n

浮点运算比较难;你必须退出bcawk为此(我的首选方法是awk):

\n
a=12.34 b=5.678    # These are strings\n\n# You cannot compare them as integers, because they're floats\nif [[ "$a" -gt "$b" ]]; then echo yes; else echo no; fi\n-bash: [[: 12.34: syntax error: invalid arithmetic operator (error token is ".34")\n\n# You can use awk though\nif awk -v a="$a" -v b="$b" 'BEGIN { exit !(a > b) }'; then echo yes; else echo no; fi\nyes\n
Run Code Online (Sandbox Code Playgroud)\n

在这里,我们分配两个awk变量abawk在有机会开始从stdin读取之前,我们将它们与>对应的true/进行数字比较并退出false。该退出状态由 shell 的构造照常awk处理。if \xe2\x80\xa6 then \xe2\x80\xa6 else \xe2\x80\xa6 fi

\n