从 Bash 脚本中检测操作系统并通知用户

Posted

技术标签:

【中文标题】从 Bash 脚本中检测操作系统并通知用户【英文标题】:Detect OS from Bash script and notify user 【发布时间】:2012-05-31 00:05:15 【问题描述】:

使用 bash,我想找到操作系统并通知用户。我试过了:

OS='uname -s'
echo "$OS"
if [ "$OS" == 'Linux' ]; then
    echo "Linux"
else 
    echo "Not Linux"
fi

我刚刚得到

uname -s 
Not Linux

在终端上,这是错误的。如何正确地将字符串设置为 uname 返回的内容?

谢谢

【问题讨论】:

【参考方案1】:

这将按要求返回操作系统 - 请注意,uname 不一定在所有操作系统上都可用,因此它不是此答案的一部分。

case "$OSTYPE" in
  linux*)   echo "linux" ;;
  darwin*)  echo "mac" ;; 
  msys*)    echo "windows" ;;
  solaris*) echo "solaris" ;;
  bsd*)     echo "bsd" ;;
  *)        echo "unknown" ;;
esac

【讨论】:

-1 这里没有特定于 Bash 的内容,但它也根本无法解决 OP 的问题。 他的问题是“使用 bash,我想找到操作系统并通知用户”uname 与操作系统无关 - 它不适用于某些操作系统。该解决方案应该适用于大多数情况下的 bash。你说得对,它不是特定于 bash 的,所以我调整了答案。 "$OSTYPE",区分安卓手机和完整的 Linux 安装。【参考方案2】:

您可能打算使用反引号,而不是单引号:

OS=`uname -s`

但你真的想要

OS=$(uname -s)

此外,您可以考虑使用 case,而不是最终将成为 if/else 系列的 if 语句:

case $( uname -s ) in
Linux) echo Linux;;
*)     echo other;;
esac

【讨论】:

感谢您的回答!那是我第一次注意到 ` 和 ' 之间的区别:D 这只是$() 优越的原因之一 :) @chepner。引号不是必需的,即使输出包含空格。 $() 是一种引用机制,因此将其放在双引号中是多余的。考虑:a='foo bar';案例 $( echo foo bar ) in; $a):;; esac $() 仅在变量赋值中紧跟= 右侧使用时才引用。试试/bin/ls $(date) 看看$() 没有引用。这可能不会对上面给出的答案产生太大影响,因为uname -s 几乎总是输出一个单词(没有空格)。 $() 根本不执行引用。 Bash 不会在变量赋值的右侧进行分词。

以上是关于从 Bash 脚本中检测操作系统并通知用户的主要内容,如果未能解决你的问题,请参考以下文章

从 bash 脚本激活 KDE 4 通知

sh bash脚本运行循环以从文件中读取随机URL和用户代理,并使用cURL运行请求。这可以从任何系统运行

从 bash 脚本检测“Windows 上的 Ubuntu”与本机 Ubuntu [重复]

从强制退出启动应用程序时检测可操作的通知按钮 - Swift

谢烟客---------Linux之bash脚本编程---用户交互

如何从 bash 脚本中 ssh?