【发布时间】: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" ]