Macos 使用带空格的变量的bash for循环
我在Mac OS 10.7.x上,需要询问网络服务,以报告针对服务定义了哪些接口,以及针对每个接口设置了哪些dns服务器Macos 使用带空格的变量的bash for循环,macos,bash,for-loop,spaces,Macos,Bash,For Loop,Spaces,我在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" ; networks
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"
如何传递这些变量?尝试用双引号括住变量:
servicesAre=`networksetup -listallnetworkservices | tail -n +2 | sed 's/.*/"&"/'` ;
for interface in "$servicesAre"; do
printf " \nFor $interface we have:\n \n" ;
networksetup -getdnsservers "$interface" ;
done
将
IFS=$'\n'
添加到开头,但不要在for循环中的变量周围添加双引号。默认情况下,输入字段分隔符包括空格和制表符。问题在于,您希望for循环每行循环一次,但bash循环中的for循环每参数循环一次。通过将变量括在引号中,可以将其合成为一个参数。为了避免这种情况,我建议放弃for循环和变量,改用while循环:
networksetup -listallnetworkservices | tail -n +2 | sed 's/.*/"&"/' |
while read interface; do
printf " \nFor $interface we have:\n \n" ;
networksetup -getdnsservers $interface ;
done
单引号不起作用。除非您特别要求shell对值进行空格拆分,否则应始终在所有变量插值周围使用双引号。感谢您迄今为止的帮助。我现在通过ok传递列表,但是networksetup命令尝试在整个列表上运行,而不是逐行运行。。。我做错了什么?是的,这是一个更好的方法@Lee,我认为这是有意义的。由于@Lauri,我通过添加
IFS=$'\n'
成功地实现了这一点,因此我也去掉了sed代码谢谢!非常有用@Lauri