Shell 如何在zsh中正确比较字符串变量和literal变量
我正在尝试在我的.zshrc中执行操作系统检查。在Ubuntu上运行时,我无法将字符串与Ubuntu进行正确的比较 片段: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
函数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问题。我只是问字符串比较,因为这是我问题的关键。但是,非常感谢您的补充建议。