cat heredocument 复制了除函数调用之外的所有内容

cat heredocument 复制了除函数调用之外的所有内容

我在 Ubuntu 16.04 环境中的 Bash 控制台中执行了以下代码:

cat <<-'DWA' > /opt/dwa.sh
    DWA() {
        test='test'
        read domain
        find /var/www/html/ -exec cp /var/www/html/${domain} /var/www/html/${test} {} \;
        sed -i 's/${domain}/${test}'/g /var/www/html/test/wp-config.php
        sed -i 's/${domain}/${test}'/g /var/www/html/test/wp-config.php
        mysql -u root -p << MYSQL
            create user '${test}'@'localhost' identified by '${psw}';
            create database ${test};
            GRANT ALL PRIVILEGES ON ${test}.* TO ${test}@localhost;
        MYSQL
    }
    DWA
DWA

除了最后一行中的代码(最后一行DWA用作函数调用)之外,所有内容都按照我的需要进行了重定向。

为什么除了最后一个DWA函数调用之外的所有内容都被复制,但只有这个流没有被复制?

DWA也许与上一篇之前有一些冲突?

答案1

最后一个DWA被删除,因为您使用它作为分隔符。分隔符告诉您的 shell 这些匹配字符串之间的所有内容都是我的此处文档的一部分。分隔符不是文档的一部分,因此在读取此处的文档时会被删除。保留之前的原因DWA是因为分隔符必须位于行的开头。我通常看到人们使用EOForEOL但这个字符串可以是您想要的任何字符串,只要它是唯一的并且不会出现在您的文档中即可。

我建议修改为:

cat <<-'EOF' > /opt/dwa.sh
    #!/bin/bash
    DWA() {
        test='test'
        read domain
        find /var/www/html/${domain} -exec cp /var/www/html/${domain} /var/www/html/${test} {} \;

        sed -i 's/${domain}/${test}'/g /var/www/html/test/wp-config.php
        sed -i 's/${domain}/${test}'/g /var/www/html/test/wp-config.php

        mysql -u root -p << MYSQL
            create user '${test}'@'localhost' identified by '${psw}';
            create database ${test};
            GRANT ALL PRIVILEGES ON ${test}.* TO ${test}@localhost;
        MYSQL
    }
    DWA
EOF

如果您确实希望这些变量在发送给您之前扩展,dwa.sh您应该取消引用EOF

我发现此页面是此处文档的非常简洁的资源: http://tldp.org/LDP/abs/html/here-docs.html

相关内容