Shell 如何在zsh中正确比较字符串变量和literal变量

Shell 如何在zsh中正确比较字符串变量和literal变量,shell,zsh,Shell,Zsh,我正在尝试在我的.zshrc中执行操作系统检查。在Ubuntu上运行时,我无法将字符串与Ubuntu进行正确的比较 片段: 函数get\u linux\u发行版() { echo`awk-F='/^NAME/{print$2}'/etc/os发行版` } 函数是_os_ubuntu() { 集合x local dist=`get\u linux\u发行版` 如果[${dist}=“Ubuntu”*];那么#awk'-F=''/^NAME/{print$2}'/etc/os发行版 +获取linux

我正在尝试在我的.zshrc中执行操作系统检查。在Ubuntu上运行时,我无法将字符串与Ubuntu进行正确的比较

片段:

函数get\u linux\u发行版()
{
echo`awk-F='/^NAME/{print$2}'/etc/os发行版`
}
函数是_os_ubuntu()
{
集合x
local dist=`get\u linux\u发行版`
如果[${dist}=“Ubuntu”*];那么#awk'-F=''/^NAME/{print$2}'/etc/os发行版
+获取linux发行版:3>echo“Ubuntu”
+是_os_ubuntu:4>本地区=““ubuntu””
+是ubuntu:5>[''ubuntu'=ubuntu*]\
如何在zsh中正确比较字符串变量和literal变量

删除
*
或将其引用,否则,它将被解析为一个glob表达式。您正确地比较了它

[[ ${dist} = "Ubuntu" ]]
因为您的字符串不是
Ubuntu
,而是
“Ubuntu”
,所以它不相等并且工作正常

请不要问XY问题

从man os发布版

os release的基本文件格式是一个以换行符分隔的列表,其中包含类似于shell的环境兼容变量分配[…]

在shell中源文件并输出变量,最好是在子shell中

get_linux_distro() {
    sh -c 'source /etc/os-release; echo "$NAME"'
}
不要使用反勾号。首选
$(…)

不要使用:
echo$(某物)
-这是对echo的无用使用,就像
echo$(echo$(echo$(某物))
。只做你想做的事,不要使用echo

使用HTTP://shellcheck.net检查脚本

如何在zsh中正确比较字符串变量和literal变量

删除
*
或将其引用,否则,它将被解析为一个glob表达式。您正确地比较了它

[[ ${dist} = "Ubuntu" ]]
因为您的字符串不是
Ubuntu
,而是
“Ubuntu”
,所以它不相等并且工作正常

请不要问XY问题

从man os发布版:

os release的基本文件格式是一个以换行符分隔的列表,其中包含类似于shell的环境兼容变量分配[…]

在shell中源文件并输出变量,最好是在子shell中

get_linux_distro() {
    sh -c 'source /etc/os-release; echo "$NAME"'
}
不要使用反勾号。首选
$(…)

不要使用:
echo$(某物)
-这是对echo的无用使用,就像
echo$(echo$(echo$(某物))
。只做你想做的事,不要使用echo


使用HTTP://shellcheck.net检查您的脚本。

虽然您得到的评论和KamilCuk.给出的答案都是正确的,但值得考虑的另一种选择是使用
[[$dist:l==*ubuntu*]]
用于测试。这将测试
dist
是否包含
ubuntu
作为子字符串,不区分大小写。

虽然您得到的评论和KamilCuk给出的答案都是正确的,但值得考虑的另一种选择是使用
[$dist:l=*ubuntu*]
用于测试。这将测试
dist
是否包含
ubuntu
作为子字符串,不区分大小写。

如果查看输出,则保存一个名称,其中包含
'“
作为变量的一部分,例如
'”ubuntu“
您是对的,由于引号的原因,它不匹配。您最好使用
[[var=~REGEX]]
,这样您就可以与
\”Ubuntu.*$
进行匹配,其中名称可能(也可能不)在
“Ubuntu
之后包含额外的文本。要这样做,您可以使用
[$dist=~\”Ubuntu.$]
。您需要转义
”“
作为
[[var=!expression]]
的一个怪癖是,如果
expression
被引用,它将被视为字符串而不是正则表达式。使用
awk
更好的方法可能是完全删除双引号,例如
dist=$(awk-F='/^NAME/{gsub(/\x22/,“”,$2);print$2}”“
或者如果您更喜欢八进制,请使用
\042
。请不要问XY问题。您对如何正确比较字符串变量感兴趣,还是想检查linux是否是ubuntu?如果您查看输出,您将保存一个名称,其中包含
”“
,作为变量的一部分,例如
”ubuntu“
您是对的,由于引号的原因,它不匹配。您最好使用
[[var=~REGEX]]
,这样您就可以与
\”Ubuntu.*$
进行匹配,其中名称可能(也可能不)在
“Ubuntu
之后包含额外的文本。要这样做,您可以使用
[$dist=~\”Ubuntu.$]
。您需要转义
”“
作为
[[var=!expression]]
的一个怪癖是,如果
expression
被引用,它将被视为字符串而不是正则表达式。使用
awk
更好的方法可能是完全删除双引号,例如
dist=$(awk-F='/^NAME/{gsub(/\x22/,“”,$2);print$2}”“
或者如果您更喜欢八进制,请使用
\042
。请不要问XY问题。您对如何正确比较字符串变量感兴趣,还是想检查linux是否是ubuntu?谢谢您提供的一般提示。我不想问XY问题。我只是问字符串比较,因为这是我问题的关键。如何解决非常感谢您的补充建议。感谢您提供的一般提示。我不打算问XY问题。我只是问字符串比较,因为这是我问题的关键。但是,非常感谢您的补充建议。