我刚刚开始学习shell脚本,并且一直在努力训练这个脚本中正在发生的事情:http://dev.cloudtrax.com/wiki/ng-cs-ip-logging
具体来说,我无法绕过使用"\$foo"
的几行,例如:
[ -z "\$plug_event" ] && return
我所阅读和了解的有关shell脚本的所有内容让我相信"\$plug_event"
会将其评估为值为$plug_event
的字符串。这意味着上面的测试总是返回1
(即测试是假的),对吗?如果是这样,有什么意义呢?
我发现很多关于变量的引用,但到目前为止我还没有找到这种用法的一个例子。这只是一个错字吗?不幸的是,我还没有足够的经验告诉它们差异。
非常感谢所有帮助,并且链接到相关文档肯定就足够了。
干杯, 凯尔
答案 0 :(得分:2)
转义所有$
的原因是这些行是here-docs的一部分
命令cat > /etc/ip_logging.sh << EOF
会将所有以下文字输出到/etc/ip_logging.sh
,直到它到达EOF
,而不是评估当前脚本中的变量,$
必须逃脱。
或者,为了使代码更容易阅读,将终止字符串放在单引号中将禁用heredoc中的变量替换:
cat > /etc/ip_logging.sh << 'EOF'
[ -z "$plug_event" ]
#other stuff
EOF
将获得相同的结果,没有转义的$
和其他shell特殊字符
答案 1 :(得分:0)
测试:
[ -z "\$plug_event" ]
毫无意义。字符串永远不会为零长度;从未执行过后的退货。
编写该代码的人不明白他们在做什么......除非有一些情有可原的情况,例如它是here-doc的一部分,然后再进行特殊处理。
但是,站在自己的立场上,这句话毫无意义。
......看看代码......
# create iptables script on the fly
cat > /etc/ip_logging.sh << EOF
#!/bin/sh
. /etc/functions.sh
install_rule() {
config_get plug_event "\$1" plug_event
[ -z "\$plug_event" ] && return
pub_ip=\$(uci get dhcp.pub.ipaddr)
pub_mask=\$(uci get dhcp.pub.netmask)
priv_ip=\$(uci get dhcp.priv.ipaddr)
priv_mask=\$(uci get dhcp.priv.netmask)
iptables -I POSTROUTING -t nat -o br-\$1 -s \$pub_ip/\$pub_mask -j LOG --log-level debug --log-prefix "iplog: "
iptables -I POSTROUTING -t nat -o br-\$1 -s \$priv_ip/\$priv_mask -j LOG --log-level debug --log-prefix "iplog: "
}
config_load network
config_foreach install_rule interface
EOF
有人确实或多或少知道他们要做什么;他们正在here-doc中编写脚本,并且需要在执行生成的脚本时扩展参数,而不是在创建脚本时。他们可以通过使用简化生活:
# create iptables script on the fly
cat > /etc/ip_logging.sh << 'EOF'
结束标记周围的引号表示在here-doc中没有进行任何扩展,因此所有反斜杠都可以进行。
bash
manual是您的朋友。 Shell parameter expansion是一个相关部分,但它涵盖了实际的扩展,而不是抑制扩展。