Md.*_*med 3 shell bash string shell-script arithmetic
问题
我必须将字符串“problem1.sh”与其自身进行比较。在我使用方括号进行比较的情况下solution1.sh (如下所示),它工作正常。但是,在我使用圆括号的情况下solution2.sh (如下所示),它不起作用。它显示了提到的错误(如下所示)。
我尝试过什么?
我试图从这里和这里了解在 bash 脚本中使用方括号和圆括号之间的区别。我知道它((expression))用于比较算术值,而不是用于字符串值。
那么,是什么造成了这个问题?
如果我从字符串“problem1.sh”中删除子字符串“.sh”并使用相同的语句进行比较if (("problem1" == "problem1")),它工作正常。但是,当我只是添加“。” 在字符串中,它会产生问题。即使我删除了除“.”之外的所有内容。从字符串并使用语句if (("." == ".")),它显示我错误。
然后,我的问题
如果该语句if (("problem1" == "problem1"))可以正常工作(可能对英文字母的每个字母都可以正常工作),为什么“。” 字符串会产生问题吗?我的意思是,为什么我们不能比较“。” if (("." == "."))当我们可以使用相同的表达式(例如if (("findError" == "findError")))比较字母时,在 bash 脚本的 if 语句(例如)中使用圆括号?
解决方案1.sh
if [ "problem1.sh" == "problem1.sh" ]
then
printf "Okay"
fi
Run Code Online (Sandbox Code Playgroud)
解决方案2.sh
if (( "problem1.sh" == "problem1.sh" ))
then
printf "Okay"
fi
Run Code Online (Sandbox Code Playgroud)
solution2.sh 的错误信息
./solution2.sh: line 1: ((: problem1.sh == problem1.sh : syntax error:
invalid arithmetic operator (error token is ".sh == problem1.sh ")
Run Code Online (Sandbox Code Playgroud)
语言翻译有问题。
在算术表达式语言中,点不存在。
您使用的语言不能在“$((...))”中工作。
里面的“$((...))”(算术表达式)有可能是唯一的编号(通常是整数一样1234),运营商(+,-,*,<<并且是==作为平等的运营商,等等),和变量(一个或多个字母,数字(不是第一个字符)和下划线)。就这样。没有string 的概念。
当您problem1在算术表达式中写入时,该语言将其理解为变量名称(如果之前未定义,则值为 0):
$ echo "==$((problem1))=="
==0==
$ problem1=34
$ echo "==$((problem1))=="
==34==
Run Code Online (Sandbox Code Playgroud)
文本是否在引号内并不重要:
$ echo "==$(("problem1"))=="
==34==
Run Code Online (Sandbox Code Playgroud)
您正在使用的((…))也是一个算术表达式,它恰好没有输出。它只是设置退出状态(并且,就像在 C 中一样,如果表达式的结果不是 0则为真)。
$ (( 1 + 1 )) ; echo "$?"
0
$ (( 0 )) ; echo "$?"
1
$ (( 1 - 10 )) ; echo "$?"
0
Run Code Online (Sandbox Code Playgroud)
但是算术表达式不理解点是什么,既不能作为运算符也不能作为变量名,因此会产生语法错误:
$ echo "$(( 1.3 ))"
bash: 1.3 : syntax error: invalid arithmetic operator (error token is ".3 ")
Run Code Online (Sandbox Code Playgroud)
这同样适用于变量名 ( problem1) 后跟一个点和另一个变量名 ( sh)。
$ echo "$((problem1.sh))"
bash: problem1.sh: syntax error: invalid arithmetic operator (error token is ".sh")
Run Code Online (Sandbox Code Playgroud)
如果运算符是 a+而不是点,则表达式将起作用:
$ echo "$((problem1+sh))"
34
Run Code Online (Sandbox Code Playgroud)
如果problem1已设置为 34(如上)。
因此,比较字符串的唯一方法是使用[[…]]:
$ [[ problem1.sh == problem1.sh ]] && echo YES
YES
Run Code Online (Sandbox Code Playgroud)
(==在这种特殊情况下不引用 的右侧,因为没有变量扩展并且字符串没有 glob 字符,但通常,请在 的右侧引用字符串==)。
或者,类似于你写的:
if [[ "problem1.sh" == "problem1.sh" ]]
then printf "Okay"
fi
Run Code Online (Sandbox Code Playgroud)