If-else语句 - 读取服务器是打开还是关闭

时间:2015-11-06 02:15:35

标签: macos bash shell if-statement

我想让我的remotelogin始终保持" On"。在这种情况下,调用.plist并运行shell脚本(上面的那个)以查看RemoteLogin是否为Off,如果是,则运行以下两个命令;否则,退出0。

我有什么东西在这里失踪吗?也许"关"需要替换为0?

if [ `sudo systemsetup -getremotelogin` = "Off" ]; then

sudo systemsetup -setremotelogin on
sudo launchctl load -w /System/Library/LaunchDaemons/ssh.plist

else 

exit 0

fi

2 个答案:

答案 0 :(得分:3)

您应该测试"Remote Login: Off"而不是"Off"

当我执行该命令时,我得到以下内容:

Blackintosh:~ jhr$ sudo systemsetup -getremotelogin
Remote Login: Off

使用:

Blackintosh:~ jhr$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.10.5
BuildVersion:   14F27

这更像是你想要的样子:

#!/usr/bin/env bash

if [ "`sudo systemsetup -getremotelogin`" = "Remote Login: Off" ]; then
    sudo systemsetup -setremotelogin on
    sudo launchctl load -w /System/Library/LaunchDaemons/ssh.plist > /dev/null 2>&1
    sudo systemsetup -getremotelogin
fi

我通常将命令执行分配给变量,就像您为函数调用和可维护性所做的那样。您通常最终需要在非平凡的脚本中输出多个位置。

remoteLoginState=`sudo systemsetup -getremotelogin`
if [ "$remoteLoginState" = "Remote Login: Off" ]; then
...
fi

并确保在脚本上设置可执行标志。

答案 1 :(得分:3)

补充Jarrod Roberson's helpful answer

问题是你使用POSIX风格的条件[ ... ],没有引用 LHS : 使用命令语法解析此类条件,这意味着 `sudo systemsetup -getremotelogin`的结果 - 由于未加引号 - 受到分词和路径名扩展的影响< /强>:

sudo systemsetup -getremotelogin产生文字字符串Remote Login: Off,应用了分词(和路径名扩展,这里恰好是无操作),然后shell执行[好像已经指定了以下内容:

[ 'Remote' 'Login:' 'Off' = 'Off' ]

正如您所看到的,现在有 3 LHS参数而不是 1 ,这违反了[ shell内置的语法并导致{你看到{1}}错误。

一个可能的解决方法是双引号命令替换并修复RHS以匹配命令替换输出的整个字符串,如Jarrod的答案。

如果您正在尝试编写符合POSIX标准的便携式脚本,那么就可以了。

相比之下,如果您专门定位[: too many arguments,那么有更好的选项可以提供更大的灵活性

bash

OR:

if [[ $(sudo systemsetup -getremotelogin) =~ 'Off' ]]; then

请注意命令替换if [[ $(sudo systemsetup -getremotelogin) == *'Off'* ]]; then (这是$(...)的优越替代品)现在需要引用,因为`...`的{ {1}}构造从bash解析 ;但是,为了保持一致,你可能仍然是双引号。

[[ ... ]]扩展正则表达式匹配应用于RHS的未加引号部分;使用[ ... ]作为RHS - 引用字符串 - 这有效地提供了子字符串匹配。

=~将glob样式模式匹配应用于RHS的未加引号部分,并匹配整个 LHS;因此'Off'也有效地提供了子串匹配。