繁体   English   中英

Shell Scripting:使用\\ $引用变量

[英]Shell Scripting: Quotes Around Variable with \$

我刚刚开始学习shell脚本,并且一直在努力研究这个脚本中正在发生的事情: http//dev.cloudtrax.com/wiki/ng-cs-ip-logging

具体来说,我无法绕过使用"\\$foo"的几行代码:

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

我读过和学习shell脚本的所有内容都让我相信"\\$plug_event"会将其评估为值为$plug_event的字符串。 这意味着上面的测试总会返回1 (即测试是假的),对吧? 如果是这样,重点是什么?

我已经在变量的引号上找到了很多,但到目前为止我还没有找到这种用法的单一例子。 这只是一个错字吗? 不幸的是,我还没有足够的经验告诉它们差异。

非常感谢所有帮助,并且链接到相关文档肯定就足够了。

干杯,凯尔

转义所有$ 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特殊字符

考试:

[ -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 手册是你的朋友。 Shell参数扩展是一个相关部分,但它涵盖了实际扩展,而不是抑制扩展。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM