2012-11-02 140 views
3

我在Mac OS 10.7.x上,需要询问网络服务来报告哪些接口是针对服务定义的,以及哪些dns服务器是针对每个服务器设置的。bash循环使用变量和空格

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" 

如何传递那些通过?

回答

3

问题是,你希望for循环每行循环一次,但对于每个参数一次循环bash循环。通过将变量包含在引号中,可以将它合并为一个参数。为了避免这种情况,我建议开放for循环和变量,并使用read和while循环代替:

networksetup -listallnetworkservices | tail -n +2 | sed 's/.*/"&"/' | 
while read interface; do 
    printf " \nFor $interface we have:\n \n" ; 
    networksetup -getdnsservers $interface ; 
done 
+0

是的,这是一个更好的方法@李,我认为它是有道理的。由于@Lauri,我设法通过增加'IFS = $'\ n''来实现这个功能,所以我也删除了sed代码 – chop

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 
+0

单引号不起作用。除非特别要求shell对值进行空白分割,否则应始终在所有变量插值周围使用双引号。 – tripleee

+0

@tripleee thanks,fixed =) –

+0

感谢您的帮助。我现在得到的列表通过ok,但networksetup命令试图在整个列表上运行,而不是一行一行......我做错了什么? – chop

5

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

+0

感谢您的支持!非常有用@Lauri – chop