Macos os x中的bash脚本--进行网络设置更改
我正在为geektool制作一个脚本,这样我就可以随时看到我的DNS设置在我的桌面上。它可以输出正确的命令,但是我得到了一个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
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
...
现在,对于命令本身,最好的选择取决于放置它们的原因