为什么这个here-doc bash语句不会在switch案例中执行

时间:2017-02-17 16:57:12

标签: bash switch-statement heredoc

我正在为Raspberry Pis开发一个bootstrapping脚本。此脚本确定Pi本身是 Model 2 还是 Model 3 ,并相应地设置其WiFi特性。

WiFi特征的变化放在/etc/rc.local文件( Raspbian )中,这是通过bootstrap.sh脚本完成的。

# model revision number to determine pi
PI_MODEL=$(cat /proc/cpuinfo | grep "Revision" | awk '{print $3}')

case "$PI_MODEL" in

"rev_1A" | "rev_1B")
    # Write the wlan config to the rc.local file
    cp /etc/rc.local /etc/rc.local.backup

    (
    cat << 'EOF'
    #!/bin/sh -e

    iwconfig wlan0 mode ad-hoc essid pi-adhoc channel 6 txpower 0

    exit 0

    EOF
    ) > /etc/rc.local

    # Case for Pi-2 ends
    ;;


"pi3_rev1a" | "pi3_rev1b")

     # write the wlan config to rc.local file


     (
     cat << 'EOF'
     #!/bin/sh -e

     ifconfig wlan0 down 
     iwconfig wlan0 mode ad-hoc channel 6 essid pi-adhoc txpower 0
     ifconfig wlan0 up

     exit 0
     EOF
     ) > /etc/rc.local
     ;;
     # case for Pi ends here
 esac

但无论如何都会发出警告:

  

警告:here-document at line ..由end-of-file分隔(想要'EOF')

     

语法错误:意外的文件结尾

这里可能出现什么问题?

主要思想是检查Pi的类型是否只是将iwconfig语句添加到/etc/rc.local文件中,以便它在重新启动时加入网络。

注意:

  • 在实际情况中,这只是一个较大的引导脚本的片段,为简洁起见,此处未显示

  • rev_1A等不是出于简洁原因而写的

参考文献:

Example 19-8 from tldp.org

2 个答案:

答案 0 :(得分:4)

由于您的here doc是缩进的,因此您应该使用-表单,以便删除前导标签。除非使用制表符进行缩进,否则您还必须在第0列处拥有结尾标记:

    cat <<-'EOF'
    #!/bin/sh -e

    iwconfig wlan0 mode ad-hoc essid pi-adhoc channel 6 txpower 0

    exit 0
EOF

来自GNU Bash Manual

  

如果重定向运算符是'&lt;&lt; - ',那么所有前导制表符都是   从输入行和包含分隔符的行中删除。这个   允许here脚本中的文档以自然方式缩进   方式。

答案 1 :(得分:0)

解决“语法错误:意外的文件结束”:

而不是:

(
cat << 'EOF'

#code

EOF
) > /etc/rc.local

你想:

cat << EOF > /etc/rc.local

#code

EOF

如果您要缩进代码(使其看起来很漂亮或其他什么)包括 EOF语句,您必须添加-来忽略前导标签,像这样:

cat <<- EOF > /etc/rc.local

    #code

    EOF