【问题标题】:Why does this *normal* string compare failed in bash?为什么这个 *normal* 字符串比较在 bash 中失败?
【发布时间】:2018-03-05 09:43:53
【问题描述】:

我有一个字符串,像这样:

DayOfWeek=$(date +%A|tr -d '\n') echo $DayOfWeek Montag

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

[ $DayOfWeek == "Monday" ] && echo True 但结果随时都是错误的。

这里还有一些尝试:

[ "$DayOfWeek" == "Monday" ] && echo True [ $(date +%A|tr -d '\n') == "Monday" ] && echo True [ $(date +%A|tr -d '\n') == "Monday" ] && echo True [ $(date +%A|tr -d '\n') == 'Monday' ] && echo True [ "$(printf "%s" "$DayOfWeek")" == "Monday" ] && echo True [ "$(date +%A|tr -d '\n')" == 'Monday' ] && echo True [[ $(date +%A|tr -d '\n') == 'Monday' ]] && echo True [[ $(date +%A|tr -d '\n') == "Monday" ]] && echo True

最后以下工作: [[ $(date +%A|tr -d '\n') == $(echo -n "Montag") ]] && echo True

有人可以向我解释 bash 的这种行为吗?使用的 bash 是 4.4.19 版本。

最好的问候, 神户

【问题讨论】:

  • 对此的一些评论:我首先假设结果没有存储为字符串。我看了一下documentation for 'if' in bash。在页面的最后一行,有一个与我的方法非常相似的示例。在示例中,它们的作用完全相同,只是使用 != 而不是 ==,因此即使存储到 bash 变量中,它也应该保持为字符串?
  • = 是字符串的普通比较运算符,而不是 ==。你想用那个tr做什么?除非你在搞乱 IFS,否则不需要它?
  • 您的每一次尝试都对我有用 (bash 4.4.12) - 请注意您的最后一个示例有 Montag - 这是一个语言环境,而不是 bash 问题...
  • 我有这个stackoverflow link 似乎支持我的观点。 tr 将删除换行符,因为我确实假设他会将其存储在字符串中,这就是失败的原因。
  • [ $DayOfWeek == "Monday" ] 是完全错误的引用方式。字符串Monday 不包含任何变量,也不需要保护它免受插值。忽略==而不是=的问题,最好写成[ "$DayOfWeek" = Monday ]。由于引号似乎会引起混淆,因此最好写[ "$DayOfWeek" = "Monday" ]

标签: bash string-comparison


【解决方案1】:

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

您可以通过在比较中使用Montag 来解决此问题,或者如果您确实需要使用英文单词,请执行以下操作:

LC_ALL=en_US.utf8 date +%A

强制使用英语语言环境。

【讨论】:

    猜你喜欢
    • 2017-09-25
    • 2019-07-22
    • 2015-04-01
    • 1970-01-01
    • 2011-04-04
    • 1970-01-01
    • 2019-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多