【发布时间】: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 返回的内容?
谢谢
【问题讨论】:
使用 bash,我想找到操作系统并通知用户。我试过了:
OS='uname -s'
echo "$OS"
if [ "$OS" == 'Linux' ]; then
echo "Linux"
else
echo "Not Linux"
fi
我刚刚得到
uname -s
Not Linux
在终端上,这是错误的。如何正确地将字符串设置为 uname 返回的内容?
谢谢
【问题讨论】:
这将按要求返回操作系统 - 请注意,uname 不一定在所有操作系统上都可用,因此它不是此答案的一部分。
case "$OSTYPE" in
linux*) echo "linux" ;;
darwin*) echo "mac" ;;
msys*) echo "windows" ;;
solaris*) echo "solaris" ;;
bsd*) echo "bsd" ;;
*) echo "unknown" ;;
esac
【讨论】:
uname 与操作系统无关 - 它不适用于某些操作系统。该解决方案应该适用于大多数情况下的 bash。你说得对,它不是特定于 bash 的,所以我调整了答案。
您可能打算使用反引号,而不是单引号:
OS=`uname -s`
但你真的想要
OS=$(uname -s)
此外,您可以考虑使用 case,而不是最终将成为 if/else 系列的 if 语句:
case $( uname -s ) in
Linux) echo Linux;;
*) echo other;;
esac
【讨论】:
$() 优越的原因之一 :)
$() 是一种引用机制,因此将其放在双引号中是多余的。考虑:a='foo bar';案例 $( echo foo bar ) in; $a):;; esac
$() 仅在变量赋值中紧跟= 右侧使用时才引用。试试/bin/ls $(date) 看看$() 没有引用。这可能不会对上面给出的答案产生太大影响,因为uname -s 几乎总是输出一个单词(没有空格)。