String 比较bashshell脚本中的两个字符串变量
我得到的输出是 sh21.sh:5:[:xhi:意外运算符 没有对手 我的代码如下:String 比较bashshell脚本中的两个字符串变量,string,bash,shell,unix,String,Bash,Shell,Unix,我得到的输出是 sh21.sh:5:[:xhi:意外运算符 没有对手 我的代码如下: #!/bin/bash s1="hi" s2="hi" s3="hello" if [ "x$s1" == "x$s2" ] then echo match else echo no match fi 请向我解释我做错了什么 if [ "x$s1" == "x$s2" ] 应该是 if [ "x$s1" = "x$s2" ] 在shell编程中使用test或[时,只有1个等号。Bash允许==与[
#!/bin/bash
s1="hi"
s2="hi"
s3="hello"
if [ "x$s1" == "x$s2" ]
then
echo match
else
echo no match
fi
请向我解释我做错了什么
if [ "x$s1" == "x$s2" ]
应该是
if [ "x$s1" = "x$s2" ]
在shell编程中使用test
或[
时,只有1个等号。Bash允许==
与[
一起使用,但不应与[
一起使用。test
和[
都是等价的,都是POSIX测试实用程序。Bash具有[[
运算符不同。它们在语法、引用要求和可用运算符方面存在细微差异
应该是
if [ "x$s1" = "x$s2" ]
在shell编程中使用
test
或[
时,只有1个等号。Bash允许==
与[
一起使用,但不应与[
一起使用。test
和[
都是等价的,都是POSIX测试实用程序。Bash具有[[
运算符不同。它们之间在语法、引用要求和可用运算符方面存在细微差异。如果要在脚本中使用bash,使用bash很重要。您的代码与bash配合良好:
$ bash sh21.sh
match
dash(类似debian系统上的sh
)失败:
=
是一种bashism,这意味着它只能在bash或类似的shell下工作。如果您想要与POSIX兼容的脚本,请使用=
。如果不需要,请在bash下运行脚本。如果您要在脚本中使用bashism,使用bash非常重要。您的代码在bash下工作正常:
$ bash sh21.sh
match
dash(类似debian系统上的sh
)失败:
=
是一种bash模式,这意味着它只能在bash或类似的shell下工作。如果您想要兼容POSIX的脚本,请使用=
。如果不需要,请在bash下运行脚本。可能您使用的是基于Debian的发行版,默认shell是dash,而不是bash
bash sh21.sh
检查你的外壳
ls -l /bin/sh /bin/bash
使用bash运行脚本
bash sh21.sh
也许您使用的是基于Debian的发行版,默认shell是dash,而不是bash
bash sh21.sh
检查你的外壳
ls -l /bin/sh /bin/bash
使用bash运行脚本
bash sh21.sh
我执行了这个,它是匹配的。我看不出问题,可能是你没有用bash shell执行这个?POSIX测试结构中只有一个
=
。@DavidC.Rankin什么是POSIX测试结构?test
是一个程序。它是一个关键字。当你键入test
或[
在shell中,您告诉shell测试下面的内容。(我认为[
实际上是test
的别名)POSIX shell只是或多或少保证与每个shell一起工作的功能子集。类似[[
被称为bash,因为它们只与bash一起工作,不能保证在shell之间可移植。哦,是的,我明白你的意思,test
是一个程序以及构成shell的所有其他程序。当我说construct时,我指的是shell使用的东西。我执行了这个程序,它与shell匹配。我看不出问题lem,可能您没有用bash shell执行此操作?POSIX测试结构中只有一个=
。@DavidC.Rankin POSIX测试结构是什么?test
是一个程序。它是一个关键字。当您在shell中键入test
或[
时,您告诉shell测试下面的内容。(我想[
实际上是测试的别名
)POSIX外壳只是或多或少保证能与每个外壳一起工作的功能子集[[被称为bashism,因为它们只与bash一起工作,不能保证在shell之间可移植。哦,是的,我明白你的意思,test
是一个程序,以及构成shell的所有其他程序。当我说construct时,我指的是shell使用的内容。shebang行显示/bin/bash
和Bash实际上容忍==
与[
也一样。我猜OP用sh scriptname
错误地运行了脚本。是的,我看到了,你是对的,但是我认为最好从规则开始,而不是用bash允许的所有异常来搅浑。我想我不能键入那么长的脚本…我不会使用“构造”这个词。对test
或[
绝对没有不适用于任何其他程序的特殊处理。(事实上,test
或[
甚至不要求是内置命令;这两个命令都可能存在于文件系统中。)用词不当。实用程序
——已修复。shebang行表示/bin/bash
,bash实际上容忍=
使用[
也一样。我猜OP用sh scriptname
错误地运行了脚本。是的,我看到了,你是对的,但是我认为最好从规则开始,而不是用bash允许的所有异常来搅浑。我想我不能键入那么长的脚本…我不会使用“构造”这个词。对test
或[
绝对没有不适用于任何其他程序的特殊处理。(事实上,test
或[
甚至不要求是内置命令;两者可能都存在于文件系统中。)用词不当。实用程序
--修复。