Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 比较bashshell脚本中的两个字符串变量_String_Bash_Shell_Unix - Fatal编程技术网

String 比较bashshell脚本中的两个字符串变量

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允许==与[

我得到的输出是 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允许
==
[
一起使用,但不应与
[
一起使用。
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
[
甚至不要求是内置命令;两者可能都存在于文件系统中。)用词不当。
实用程序
--修复。