Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos os x中的bash脚本--进行网络设置更改_Macos_Bash_Scripting - Fatal编程技术网

Macos os x中的bash脚本--进行网络设置更改

Macos os x中的bash脚本--进行网络设置更改,macos,bash,scripting,Macos,Bash,Scripting,我正在为geektool制作一个脚本,这样我就可以随时看到我的DNS设置在我的桌面上。它可以输出正确的命令,但是我得到了一个 command not found... 这是我的剧本 #!/bin/bash IFS=' ' getdns='networksetup -getdnsservers' # [-getdnsservers networkservice] setdns='networksetup -setdnsservers' # usage

我正在为geektool制作一个脚本,这样我就可以随时看到我的DNS设置在我的桌面上。它可以输出正确的命令,但是我得到了一个

command not found...
这是我的剧本

#!/bin/bash
IFS='
'

getdns='networksetup -getdnsservers'
#                   [-getdnsservers networkservice]

setdns='networksetup -setdnsservers'
# usage             [-setdnsservers networkservice dns1 [dns2] [...]]

services=(`networksetup -listallnetworkservices`)



for i in ${services[*]}; do

# original setup, which returns the correct command
# [[ ! $i =~ "*" || $1 =~ "W"  ]] && echo $getdns \"$i\"

# command that fails when attempting to execute string...
#   # [[ ! $i =~ "*" || $1 =~ "W"  ]] && echo `$getdns \"$i\"`

# my attempt to concatenate the strings 
[[ ! $i =~ "*" || $1 =~ "W"  ]] && cmd="$getdns '$i'" ;echo `$cmd`

done
以下是一个示例输出:

/Users/user/bin/netd3: line 15: networksetup -getdnsservers 'Wi-Fi': command not found
我可以运行
哪个networksetup
,它返回
/usr/sbin/networksetup
,但它没有运行


我缺少什么?

您的脚本正在尝试将字符串
networksetup-getdnsservers'Wi-Fi'
作为单个命令执行。 使用


您的脚本正在尝试将字符串
networksetup-getdnsservers'Wi-Fi'
作为单个命令执行。 使用


您的脚本正在尝试将字符串
networksetup-getdnsservers'Wi-Fi'
作为单个命令执行。 使用


您的脚本正在尝试将字符串
networksetup-getdnsservers'Wi-Fi'
作为单个命令执行。 使用


您还可以在脚本顶部的
#下添加以下内容/bin/bash

PATH=/bin:/usr/bin:/sbin:/usr/sbin export PATH

您还可以在脚本顶部的
#下添加以下内容/bin/bash

PATH=/bin:/usr/bin:/sbin:/usr/sbin export PATH

您还可以在脚本顶部的
#下添加以下内容/bin/bash

PATH=/bin:/usr/bin:/sbin:/usr/sbin export PATH

您还可以在脚本顶部的
#下添加以下内容/bin/bash

PATH=/bin:/usr/bin:/sbin:/usr/sbin export PATH

在执行时将命令存储在变量中是有问题的(请参阅)。最大的问题是在替换变量之前对引号进行求值,因此在变量中嵌入引号(例如,
cmd=“$getdns'$i'”
中的单引号)并不能达到预期效果

在您的特定情况下,还有一个问题:您将IFS设置为仅换行,因此当shell展开
$cmd
时,它通过查找换行符将其拆分为“字”——没有换行符,因此它会错误地将命令本身的一部分作为参数(
-getdnsservers
'Wi-Fi'
)。也就是说,它不会运行带有参数“-getdnsservers”和“-getdnsservers”的命令“networksetup” “‘Wi-Fi’”;相反,它尝试将“networksetup-getdnsservers'Wi-Fi'”作为命令运行

我会提出几个建议来清理这个。首先,在获得服务列表后,将IFS设置回其正常值。这也意味着您需要在
for
循环中使用正确的引号(使用双引号,以及
[@]
而不是
[*]
)。您还需要清理列表以删除已禁用服务的标题和“*”。最后,与反引号相比,我更喜欢
$()
,因此我将继续并更改:

saveIFS="$IFS"
IFS='
'
services=( $(networksetup -listallnetworkservices | sed '/An asterisk ([*]) denotes that a network service is disabled./d; s/^[*]//') )
IFS="$saveIFS"

for i in "${services[@]}"; do
    ...
现在,对于命令本身,最好的选择取决于为什么首先将它们放入变量中。最简单、最直接的选择是直接使用命令:

[[ ! $i =~ "*" || $1 =~ "W"  ]] && networksetup -getdnsservers "$i"
如果要使用命令的简写形式,请使用函数而不是变量:

getdns() {
    networksetup -getdnsservers "$@"
}
...
[[ ! $i =~ "*" || $1 =~ "W"  ]] && getdns "$i"
如果在执行之前需要存储整个命令(包括参数),请使用数组:

[[ ! $i =~ "*" || $1 =~ "W"  ]] && cmd=(networksetup -getdnsservers "$i") && "$cmd[@]"

在执行时将命令存储在变量中是有问题的(请参阅)。最大的问题是在替换变量之前对引号进行求值,因此在变量中嵌入引号(例如,
cmd=“$getdns'$i'”
中的单引号)并不能达到预期效果

在您的特定情况下,还有一个问题:您将IFS设置为仅换行,因此当shell展开
$cmd
时,它通过查找换行符将其拆分为“字”——没有换行符,因此它会错误地将命令本身的一部分作为参数(
-getdnsservers
'Wi-Fi'
)。也就是说,它不会运行带有参数“-getdnsservers”和“-getdnsservers”的命令“networksetup” “‘Wi-Fi’”;相反,它尝试将“networksetup-getdnsservers'Wi-Fi'”作为命令运行

我会提出几个建议来清理这个。首先,在获得服务列表后,将IFS设置回其正常值。这也意味着您需要在
for
循环中使用正确的引号(使用双引号,以及
[@]
而不是
[*]
)。您还需要清理列表以删除已禁用服务的标题和“*”。最后,与反引号相比,我更喜欢
$()
,因此我将继续并更改:

saveIFS="$IFS"
IFS='
'
services=( $(networksetup -listallnetworkservices | sed '/An asterisk ([*]) denotes that a network service is disabled./d; s/^[*]//') )
IFS="$saveIFS"

for i in "${services[@]}"; do
    ...
现在,对于命令本身,最好的选择取决于为什么首先将它们放入变量中。最简单、最直接的选择是直接使用命令:

[[ ! $i =~ "*" || $1 =~ "W"  ]] && networksetup -getdnsservers "$i"
如果要使用命令的简写形式,请使用函数而不是变量:

getdns() {
    networksetup -getdnsservers "$@"
}
...
[[ ! $i =~ "*" || $1 =~ "W"  ]] && getdns "$i"
如果在执行之前需要存储整个命令(包括参数),请使用数组:

[[ ! $i =~ "*" || $1 =~ "W"  ]] && cmd=(networksetup -getdnsservers "$i") && "$cmd[@]"

在执行时将命令存储在变量中是有问题的(请参阅)。最大的问题是在替换变量之前对引号进行求值,因此在变量中嵌入引号(例如,
cmd=“$getdns'$i'”
中的单引号)并不能达到预期效果

在您的特定情况下,还有一个问题:您将IFS设置为仅换行,因此当shell展开
$cmd
时,它通过查找换行符将其拆分为“字”——没有换行符,因此它会错误地将命令本身的一部分作为参数(
-getdnsservers
'Wi-Fi'
)。也就是说,它不会运行带有参数“-getdnsservers”和“-getdnsservers”的命令“networksetup” “‘Wi-Fi’”;相反,它尝试将“networksetup-getdnsservers'Wi-Fi'”作为命令运行

我会提出几个建议来清理这个。首先,在获得服务列表后,将IFS设置回其正常值。这也意味着您需要在
for
循环中使用正确的引号(使用双引号,以及
[@]
而不是
[*]
)。您还需要清理列表以删除已禁用服务的标题和“*”。最后,与反引号相比,我更喜欢
$()
,因此我将继续并更改:

saveIFS="$IFS"
IFS='
'
services=( $(networksetup -listallnetworkservices | sed '/An asterisk ([*]) denotes that a network service is disabled./d; s/^[*]//') )
IFS="$saveIFS"

for i in "${services[@]}"; do
    ...
现在,对于命令本身,最好的选择取决于放置它们的原因