从 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 脚本中检测操作系统并通知用户的主要内容,如果未能解决你的问题,请参考以下文章
sh bash脚本运行循环以从文件中读取随机URL和用户代理,并使用cURL运行请求。这可以从任何系统运行
从 bash 脚本检测“Windows 上的 Ubuntu”与本机 Ubuntu [重复]
从强制退出启动应用程序时检测可操作的通知按钮 - Swift