在bash中的文本正文中打印数组元素

时间:2014-07-24 16:25:42

标签: arrays bash printing echo heredoc

我正在编写一个bash脚本来生成公共文件:/etc/udev/rules.d/70-persistent-net.rules。你可以看到我的函数有3个参数,其中2个是数组。我正在尝试在下面的文本中内联打印数组元素(其中显示ATTR{address}==并将其保存到文件中,但尚未成功。

我在==参数之后保留引号时遇到问题。

function make_70_persistent_net_rules_file() {
# argument 1:  intel_mac_number     - number                                                                                                                                                    
# argument 2:  intel_mac_addresses  - array with 2 or 4 elements                                                                                                                                
# argument 3:  im_mac_addresses     - array with 2 elements                                                                                                                                     

    if [ "$intel_mac_number" -eq "2" ]; then
        echo "# This file was automatically generated by the /lib/udev/write_net_rules                                                                                                          
# program, run by the persistent-net-generator.rules rules file.                                                                                                                                
#                                                                                                                                                                                               
# You can modify it, as long as you keep each rule on a single                                                                                                                                  
# line, and change only the value of the NAME= key.                                                                                                                                             

# PCI device 0x8086:0x1521 (igb)                                                                                                                                                                
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="${intel_mac_addresses[0]}", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"                                                          

# PCI device 0x8086:0x1521 (igb)                                                                                                                                                                
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="${intel_mac_addresses[1]}", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"                                   

# PCI device 0x8086:0x10e6 (igb)                                                                                                                                                                
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="${im_mac_addresses[0]}", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth2"                                      

# PCI device 0x8086:0x10e6 (igb)                                                                                                                                                                
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="${im_mac_addresses[1]}", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth3""  > 70-persistent-net.rules-TEST
    fi
}

如果你不熟悉70-persistent-net.rules文件,我试图使用我的数组来打印mac地址:

# This file was automatically generated by the /lib/udev/write_net_rules
# program, run by the persistent-net-generator.rules rules file.
#
# You can modify it, as long as you keep each rule on a single
# line, and change only the value of the NAME= key.

# PCI device 0x10ec:0x8168 (r8169)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="bb:bb:bb:bb:bb:bb", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"

# PCI device 0x8086:0x0887 (iwlwifi)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="aa:aa:aa:aa:aa:aa", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"

谢谢

1 个答案:

答案 0 :(得分:2)

您应该使用heredoc而不是echo使用多行字符串。这样可以防止引用问题,因为 - 在您的情况下,"既可用作字符串分隔符,也可用作内部文本。

    if [ "$intel_mac_number" -eq "2" ]; then
        cat > 70-persistent-net.rules-TEST << EOF
# This file was automatically generated by the /lib/udev/write_net_rules                                                                                                          
# program, run by the persistent-net-generator.rules rules file.                                                                                                                                
#                                                                                                                                                                                               
# You can modify it, as long as you keep each rule on a single                                                                                                                                  
# line, and change only the value of the NAME= key.                                                                                                                                             

# PCI device 0x8086:0x1521 (igb)                                                                                                                                                                
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="${intel_mac_addresses[0]}", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"                                                          

# PCI device 0x8086:0x1521 (igb)                                                                                                                                                                
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="${intel_mac_addresses[1]}", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"                                   

# PCI device 0x8086:0x10e6 (igb)                                                                                                                                                                
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="${im_mac_addresses[0]}", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth2"                                      

# PCI device 0x8086:0x10e6 (igb)                                                                                                                                                                
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="${im_mac_addresses[1]}", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth3"
EOF
    fi