shell - 如何将字符串变量与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 具有更高的可见性。
解决方案
如何正确地将字符串变量与 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 检查您的脚本。
推荐阅读
- android - 从firebase实时数据库中单个子项下的多个推送ID中检索数据
- c++ - 为什么它不起作用?简单的多线程示例
- java - 有什么办法可以阻止这个页面直接跳转到另一个页面?
- android-studio - Flutter:找不到提供程序安装程序的本地模块描述符类
- r - 如何每 30 天计算和绘制相关系数
- reactjs - 如何仅在第二次访问页面时显示DIV
- java - 使用导航组件折叠工具栏
- android - 使用 UiDevice 滑动的 x,y 边界是多少
- android - 2个相似片段之间的共享元素转换
- javascript - 为什么 v-model 在 vue.extend 中使用时不起作用?