我正在为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
等不是出于简洁原因而写的
答案 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
如果重定向运算符是'&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