我发现这个简单的 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
结果是:
if_equal.sh: 6: if_equal.sh: Learn Bash: not found
Both Strings are not Equal.
基本上我希望 if 将 awk 的结果与浮点数进行一次比较,然后与用户给出的整数进行比较,所以当我可以时,我使用
[ "$c" -gt "$o" ]
但它不适用于浮点数,我也不能使用第三个变量来循环它,如下所示:
[ "$c" -gt "$o" ] && echo fine || [ "$b" -gt "$o" ] && echo better
我已经检查了所有空格,尝试使用和不使用“、[]、()、(())...我找不到为什么 if 发现第一个变量丢失。顺便说一句,我的脚本创建了一个文件“0.9500”因为我运行它
if (( "$c" > "0.9500" ))
也许有解决方法?
答案1
中bash
,(( ... ))
是算术评估。在sh
shell 中,即您的脚本由于 -line 而使用的 shell #!
,它很可能被解释为两个嵌套的子 shell。这就是为什么0.9500
当您(( "$c" > "0.9500" ))
使用sh
shell 运行时会得到一个被调用的文件。这>
是一个 I/O 重定向,而不是比较运算符,并且$c
会被解释为命令,这就是导致“未找到”错误消息的原因。
在sh
shell 中,如果要比较字符串,请使用
[ "$str1" = "$str2" ]
如果您想比较整数,请使用,例如
[ "$num1" -gt "$num2" ]
在bash
shell 中,你也可以使用上面的语法,但是你也可以使用
[[ "$str1" == "$str2" ]]
比较两个字符串是否相等,以及
(( num1 > num2 ))
比较两个整数。
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
请注意,比较的布尔结果必须反转,才能!
将其转换为 shell 的退出状态。
有关的:
答案2
首先,sh
不处理(( … ))
。您可以使用bash
,但即使如此,它也仅适用于数字整数表达式。请参阅本答案后面的sh
兼容使用awk
。我注意到您将脚本描述为bash
脚本,但您已将其用作#!/bin/sh
标题。此标头将脚本声明为sh
脚本,其语法略有不同。
如果您正在使用bash
您应该在文档 ( man bash
) 中搜索((
(您可能需要转义括号,即\(\(
,如果您的寻呼机需要它)。你会发现这段文字,
((expression))
该表达式根据下面描述的规则进行计算算术评估。
向下搜索ARITHMETIC EVALUATION
,你最终会读到这个(我的重点),
算术评估shell 允许在某些情况下计算算术表达式(请参阅
let
和declare
内置命令、((
复合命令和算术扩展)。评估以固定宽度整数完成,不检查溢出[...]
这告诉你的是,该(( … ))
构造可以评估整数运算。它不适用于字符串或浮点运算。
现在继续回答sh
或bash
。
您可以使用[ … ]
或处理字符串[[ … ]]
,
if [[ "$str1" == "$str2" ]] … # bash
或者
if [ "$str1" = "$str2" ] … # POSIX including sh, and bash
浮点运算比较难;你必须退出bc
或awk
为此(我的首选方法是awk
):
a=12.34 b=5.678 # These are strings
# You cannot compare them as integers, because they're floats
if [[ "$a" -gt "$b" ]]; then echo yes; else echo no; fi
-bash: [[: 12.34: syntax error: invalid arithmetic operator (error token is ".34")
# You can use awk though
if awk -v a="$a" -v b="$b" 'BEGIN { exit !(a > b) }'; then echo yes; else echo no; fi
yes
在这里,我们分配两个awk
变量a
和b
。在awk
有机会开始读取之前标准输入我们将它们与数字进行比较,并以对应于/ 的>
状态退出。该退出状态由 shell 的构造照常处理。true
false
awk
if … then … else … fi