4

我在 Mac OS 10.7.x 上,需要询问网络服务以报告针对服务定义的接口以及针对每个服务设置的 dns 服务器。

servicesAre=`networksetup -listallnetworkservices | tail -n +2 | sed 's/.*/"&"/'` ; 
for interface in $servicesAre ; do 
      printf " \nFor $interface we have:\n \n" ; 
      networksetup -getdnsservers $interface ; 
done

我的问题是接口的初始变量列表中的空格:

"USB Ethernet"  
"Display Ethernet"  
"Wi-Fi"  
"Bluetooth PAN"

我如何通过这些?

4

3 回答 3

8

添加IFS=$'\n'到开头,但不要在 for 循环中的变量周围添加双引号。默认情况下,输入字段分隔符包括空格和制表符。

于 2012-11-02T16:48:07.580 回答
4

问题是您希望 for 循环每行循环一次,但 bash 中的 for 循环每个参数循环一次。通过将变量括在引号中,您可以将其复合为一个参数。为避免这种情况,我建议放弃 for 循环和变量,而改用readwhile 循环:

networksetup -listallnetworkservices | tail -n +2 | sed 's/.*/"&"/' |
while read interface; do 
    printf " \nFor $interface we have:\n \n" ; 
    networksetup -getdnsservers $interface ; 
done
于 2012-11-02T16:57:06.730 回答
1

尝试用双引号将变量括起来:

servicesAre=`networksetup -listallnetworkservices | tail -n +2 | sed 's/.*/"&"/'` ; 
for interface in "$servicesAre"; do 
      printf " \nFor $interface we have:\n \n" ; 
      networksetup -getdnsservers "$interface" ; 
done
于 2012-11-02T15:34:55.557 回答