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

7

我想使用bash查找操作系统并通知用户。我尝试了:

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

我刚刚明白了。
uname -s 
Not Linux

在终端上执行时,输出不正确。我该如何将字符串设置为uname返回的内容?谢谢。
2个回答

13

你可能想使用反引号而不是单引号:

OS=`uname -s`

但你真正想要的是什么

OS=$(uname -s)

此外,您可以考虑使用case语句,而不是一个if语句,因为if语句最终会变成一个if/else系列。

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

1
这只是 $() 更优秀的一个原因 :) - chepner
建议引用:case "$(uname -s)",以防输出包含空格(尽管这种情况可能极为罕见)。 - chepner
1
@chepner。即使输出包含空格,也不需要引号。$()是一种引用机制,因此将其放在双引号中是多余的。考虑:a ='foo bar'; case $(echo foo bar)in; $ a):; ; esac - William Pursell
1
$() 只在紧跟着变量赋值符号 = 的右侧使用时才需要引用。尝试执行 /bin/ls $(date) 命令,可以看到 $() 没有被引用的情况。这可能对上面给出的答案影响不大,因为 uname -s 输出的几乎总是一个单词(没有空格)。 - Francis Litterio
1
$()完全不执行引用。Bash在变量赋值的右侧不进行单词拆分。 - jordanm
显示剩余3条评论

2

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

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

这里没有什么特别针对Bash的内容,但它也完全没有解决问题。 - tripleee
这个问题是说“使用bash,我想要找到操作系统并通知用户”。uname不是跨平台的 - 它在某些操作系统上无法工作。这个解决方案应该在大多数bash上都能工作。你说得对,它不是特定于bash的,所以我已经调整了答案。 - rjmoggach
"$OSTYPE" 可以区分安卓手机和完整的 Linux 安装。 - Alejandro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接