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

How to compare a string variable against a literal in zsh

我正在尝试 OS 检查我的 .zshrc。当 Ubuntu 上的 运行 时,我无法对 Ubuntu 进行字符串比较以正确匹配。

片段:

function get_linux_distro()
{
    echo `awk -F= '/^NAME/{print }' /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 }' /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 具有更高的可见性。

How to correctly compare a string variable against a litteral in zsh

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

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

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

请不要问XY问题。

来自man os-release

The basic file format of os-release is a newline-separated list of environment-like shell-compatible variable assignments. [...]

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

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

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

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

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

虽然你得到的评论,以及KamilCuk给出的答案。当然是正确的,一个值得考虑的替代方法是使用 [[ $dist:l == *ubuntu* ]] 进行测试。这将测试 dist 是否包含 ubuntu 作为子字符串,不区分大小写。