使用带空格变量的Bash for循环

5
我正在使用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"

我该如何传递它们? (涉及IT技术)
3个回答

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

4
问题在于你希望for循环每行循环一次,但bash中的for循环是按参数循环一次。通过将变量用引号括起来,你将其合并为一个参数。为避免这种情况,我建议放弃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

是的,这是一个更好的方法@Lee,我看到它很有道理。我通过添加IFS=$'\n'成功地使其工作,感谢@Lauri,因此我也剥离了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

单引号不起作用。您应始终在所有变量插值周围使用双引号,除非您特别要求 shell 对这些值进行空格拆分。 - tripleee
谢谢你到目前为止的帮助。我现在已经成功传递了列表,但是networksetup命令尝试对整个列表而不是逐行运行...我做错了什么? - chop

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接