Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 使用带空格的变量的bash for循环_Macos_Bash_For Loop_Spaces - Fatal编程技术网

Macos 使用带空格的变量的bash for循环

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

我在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"

如何传递这些变量?

尝试用双引号括住变量:

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