【问题标题】:bash for loop using variables with spacesbash for循环使用带空格的变量
【发布时间】:2012-10-23 06:55:04
【问题描述】:

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

我如何通过这些?

【问题讨论】:

    标签: macos bash for-loop spaces


    【解决方案1】:

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

    【讨论】:

    • 谢谢!非常有用@Lauri
    【解决方案2】:

    问题是您希望 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,我认为这是有道理的。感谢@Lauri,我设法通过添加IFS=$'\n' 来完成这项工作,因此我还删除了 sed 代码
    【解决方案3】:

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

    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 对值进行空格分割。
    • 感谢您到目前为止的帮助。我现在可以通过列表了,但是 networksetup 命令尝试在整个列表上运行,而不是逐行运行...我做错了什么?
    猜你喜欢
    • 2015-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-14
    • 2011-10-25
    • 1970-01-01
    相关资源
    最近更新 更多