Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/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
为什么在bash中这个*normal*字符串比较失败?_Bash_String Comparison - Fatal编程技术网

为什么在bash中这个*normal*字符串比较失败?

为什么在bash中这个*normal*字符串比较失败?,bash,string-comparison,Bash,String Comparison,我有一个字符串,如下所示: DayOfWeek=$(日期+%A | tr-d'\n') echo$DayOfWeek 蒙塔格 我希望将命令的结果与字符串进行比较。就这样, [$DayOfWeek==“星期一”]&&echo True 但结果是错误的 这里还有一些尝试: [“$DayOfWeek”==“Monday”]&&echo True [$(日期+%A | tr-d'\n')=“星期一”]&回显为真 [$(日期+%A | tr-d'\n')=“星期一”]&回显为真 [$(日期+%A |

我有一个字符串,如下所示:

DayOfWeek=$(日期+%A | tr-d'\n')
echo$DayOfWeek
蒙塔格

我希望将命令的结果与字符串进行比较。就这样,

[$DayOfWeek==“星期一”]&&echo True
但结果是错误的

这里还有一些尝试:

[“$DayOfWeek”==“Monday”]&&echo True
[$(日期+%A | tr-d'\n')=“星期一”]&回显为真
[$(日期+%A | tr-d'\n')=“星期一”]&回显为真
[$(日期+%A | tr-d'\n')=='Monday']&&echo True
[“$(printf”%s“$DayOfWeek”)”==“星期一”]&&echo True
[“$(日期+%A | tr-d'\n')”==“星期一”]&回显为真
[[$(日期+%A | tr-d'\n')=='星期一']&&echo True
[[$(日期+%A | tr-d'\n')==“星期一”]&&echo True

最后,以下几点正在发挥作用:

[[$(日期+%A | tr-d'\n')=$(echo-n“Montag”)]]&&echo True

有人能给我解释一下bash的这种行为吗?使用的bash版本是4.4.19

致以最良好的祝愿,
akendo

您在尝试中使用了英文单词
Monday
,但您的工作示例使用了
Montag
。我猜您使用的是
DE
locale

您可以在比较中使用
Montag
,或者如果您确实需要使用英语单词,请执行以下操作:

LC_ALL=en_US.utf8 date +%A

强制使用英语区域设置。

对此有一些评论:首先,我假设结果没有存储为字符串。我看了一眼。在本页的最后一行,有一个与我的方法非常相似的示例。在本例中,它们的功能完全相同,只需使用
=
而不是
=
,因此即使存储到bash变量中,它也应该保持为字符串?
=
是字符串的常规比较运算符,而不是
=
。你想用它做什么?除非你搞乱了IFS,否则它是不需要的?你的每一次尝试都对我有用(
bash 4.4.12
)-请注意,你的上一个例子有
Montag
-这是一个区域设置,不是bash问题…我有这个似乎支持我的观点。
tr
将删除换行符,因为我确实假设他会将其存储在字符串中,这就是失败的原因。
[$DayOfWeek==“Monday”]
完全是错误的引用方式。字符串
Monday
不包含任何变量,不需要保护它不受插值的影响。忽略
=
而不是
=
的问题,最好将其写成
[“$DayOfWeek”=Monday]
。由于引号似乎会引起混淆,因此最好编写
[“$DayOfWeek”=“Monday”]