【问题标题】:Why won't this here-doc bash statement execute in a switch case为什么这个 here-doc bash 语句不会在 switch case 中执行
【发布时间】:2017-07-07 07:18:31
【问题描述】:

我正在为 Raspberry Pis 开发一个引导脚本。此脚本确定 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 .. 由文件结尾分隔(需要 `EOF')

语法错误:文件意外结束

这里可能出了什么问题?

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

注意事项:

  • 在实际情况下,这只是一个更大的引导脚本的 sn-p,为简洁起见,此处未显示

  • rev_1A 等不写是为了简洁

参考资料:

Example 19-8 from tldp.org

【问题讨论】:

  • 这不应该担心。那东西有效。您在我收到的 here-doc 错误和警告中是否有提示/?
  • 删除'EOF'的引号?
  • @SiKing 尝试了两种方式。

标签: bash switch-statement heredoc


【解决方案1】:

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

代替:

(
cat << 'EOF'

#code

EOF
) > /etc/rc.local

你想要:

cat << EOF > /etc/rc.local

#code

EOF

如果您想缩进您的代码(使其看起来更漂亮,或其他)包括EOF 语句,您必须添加- 以忽略前导制表符,如下所示:

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

    #code

    EOF

【讨论】:

  • 这正是我之前实现的,但这也产生了同样的错误。
  • 在我的情况下,正如@Greg Tarsa 提到的&lt;&lt;- 被证明是至关重要的。我猜是因为缩进
  • @Shan-Desai 我不明白。 - 只是关于formatting,与syntax 无关。您的帖子询问语法错误。
  • 我会尝试再次重现这些条件并尽快回复您。
  • @Shan-Desai 刚刚检查:我错了!我也确实影响了语法:EOF&lt;tab&gt;EOF 之间存在差异。 - 将忽略前导 &lt;tab&gt;。我更新了我的答案。 +1 @Greg_Tarsa
【解决方案2】:

由于您的此处文档是缩进的,您应该使用- 表单,以便删除前导制表符。您还必须在第 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;-,因为这似乎不起作用&lt;&lt; -
  • 完成。该空间现已移除。
猜你喜欢
  • 2015-07-16
  • 1970-01-01
  • 2020-09-05
  • 2017-04-13
  • 1970-01-01
  • 2014-03-27
  • 1970-01-01
相关资源
最近更新 更多