0

我刚刚开始学习 shell 脚本,并一直在尝试锻炼这个脚本中发生的事情:http: //dev.cloudtrax.com/wiki/ng-cs-ip-logging

具体来说,我不能绕着几行使用"\$foo"例如:

[ -z "\$plug_event" ] && return

我所阅读和了解的有关 shell 脚本的所有内容都让我相信它"\$plug_event"会评估为一个值为$plug_event. 这意味着上面的测试总是会返回一个1(即测试是假的),对吧?如果是这样,有什么意义?

我在变量周围的引号中找到了很多,但到目前为止,我还没有找到这种用法的一个例子。这只是一个错字吗?不幸的是,我还远没有足够的经验来分辨差异。

非常感谢所有帮助,并且指向相关文档的链接当然就足够了。

干杯,凯尔

4

2 回答 2

2

转义所有$s 的原因是这些行是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 特殊字符

于 2013-05-23T17:05:35.530 回答
0

考试:

[ -z "\$plug_event" ]

是没有意义的。字符串永远不会是零长度;之后的 return 永远不会执行。

编写该代码的人不明白他们在做什么……除非有情有可原的情况,例如它是 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'

结束标记周围的引号表示此处文档中未进行任何扩展,因此所有反斜杠都可以删除。

bash 手册是你的朋友。 Shell 参数扩展是一个相关部分,但它涵盖了实际扩展,而不是抑制扩展。

于 2013-05-23T17:05:17.177 回答