【问题标题】:Detect OS from Bash script and notify user从 Bash 脚本中检测操作系统并通知用户
【发布时间】: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 返回的内容?

谢谢

【问题讨论】:

    标签: string bash system 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 不会在变量赋值的右侧进行分词。
    猜你喜欢
    • 1970-01-01
    • 2010-09-28
    • 1970-01-01
    • 2020-09-19
    • 2012-04-29
    • 2012-03-29
    • 2012-02-05
    • 1970-01-01
    • 2012-04-01
    相关资源
    最近更新 更多