首页 > 解决方案 > 如何将字符串变量与zsh中的文字进行比较

问题描述

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

片段:

function get_linux_distro()
{
    echo `awk -F= '/^NAME/{print $2}' /etc/os-release`
}

function is_os_ubuntu()
{
    set -x
    local dist=`get_linux_distro`
    if [[ ${dist} = "Ubuntu"* ]]; then  # <<< string comp
        echo "UBUNTU"
        return 0
    else
        echo "BLAHHHH"
        return 1
    fi
}

输出:

❯ is_os_ubuntu
+is_os_ubuntu:4> get_linux_distro
+get_linux_distro:3> awk '-F=' '/^NAME/{print $2}' /etc/os-release
+get_linux_distro:3> echo '"Ubuntu"'
+is_os_ubuntu:4> local dist='"Ubuntu"'
+is_os_ubuntu:5> [[ '"Ubuntu"' = Ubuntu* ]]  # <<< don't match due to quotes??
+is_os_ubuntu:10> echo BLAHHHH
BLAHHHH
+is_os_ubuntu:11> return 1

注意:我添加了 bash 标记,因为我相信这在两者中都是相同的,并且 bash 具有更高的可见性。

标签: shellzsh

解决方案


如何正确地将字符串变量与 zsh 中的文字进行比较

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

[[ ${dist} = "Ubuntu" ]]

因为您的字符串不是Ubuntu, but "Ubuntu",所以它不相等并且可以正常工作。

请不要问 XY 问题。

来自man os-release

os-release 的基本文件格式是一个换行符分隔的类似环境的 shell 兼容变量赋值列表。[...]

在 shell 中获取文件并输出变量,最好在子 shell 中。

get_linux_distro() {
    sh -c 'source /etc/os-release; echo "$NAME"'
}

不要使用反引号`。更喜欢$(...).

不要使用:echo $(something)- 这是对 echo 的无用使用,例如echo $(echo $(echo $(something))). 做你想做的事,没有回声。

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


推荐阅读