如何将字符串变量与 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
作为子字符串,不区分大小写。
我正在尝试 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
作为子字符串,不区分大小写。