Bash 不将此处文档输出到文件

Bash 不将此处文档输出到文件

这个bash脚本似乎坏了:

#!/bin/bash
echo "It prints ok"
cat << 'EOF' > ~/doFoo.sh
        echo 'nested script doing Foo'
EOF
echo "It never prints"
cat << 'EOF' > ~/doBar.sh
        echo 'nested script doing Bar'
EOF
echo "It never prints too"
#  Here there is no doFoo.sh or doBar.sh in ~
ls -l ~/doFoo.sh ~/doBar.sh

该脚本仅打印第一条消息 ( It prints ok) 并创建一个名为doFoo.sh'$'\r'以下内​​容的文件:

        echo 'nested script doing Foo'
EOF
echo "It never prints"
cat << 'EOF' > ~/doBar.sh
        echo 'nested script doing Bar'
EOF
echo "It never prints too"
#  Here there is no doFoo.sh or doBar.sh in ~

@Jim L. 添加该行后,您告诉确切的输出仍然是:

It prints ok

仅此而已。

答案1

您在 Windows 系统上编写了脚本,使用编辑器将其保存为 DOS 文本文件。根据评论,你然后nano在 Unix 系统上编辑了几次。 Unix 上的大多数文本编辑器(nano包括在内)都会注意到文本文件是 DOS 格式,然后在稍后保存文件时保留此格式。对于,如果您使用或nano启动编辑器,它将始终以 Unix 文本格式保存。-u--unix

由于 DOS 文本文件具有“crlf”(回车+换行)换行符,而 Unix 文本文件具有“lf”(换行)换行符,这意味着当由 Unix 工具读取时,每一行现在都有一个回车符它的结尾(不可见,但通常编码为^M\r)。这些回车符会干扰脚本中的命令。

例如,这使得 shell 无法找到EOF第一个此处文档的结尾,因为该行实际上EOF\r,不是EOF

cat -v如果您在脚本上使用,您将看到回车符:

$ cat -v script
#!/bin/bash^M
echo "It prints ok"^M
cat << 'EOF' > ~/doFoo.sh^M
        echo 'nested script doing Foo'^M
EOF^M
echo "It never prints"^M
cat << 'EOF' > ~/doBar.sh^M
        echo 'nested script doing Bar'^M
EOF^M
echo "It never prints too"^M
#  Here there is no doFoo.sh or doBar.sh in ~^M

只需使用 将您的脚本文件转换为 Unix 脚本文件,它就会被修复,或者在按照上述说明使用或启动后将dos2unix文本保存在 中。nanonano-u--unix

$ dos2unix script
dos2unix: converting file script to Unix format...
$ cat -v script
#!/bin/bash
echo "It prints ok"
cat << 'EOF' > ~/doFoo.sh
        echo 'nested script doing Foo'
EOF
echo "It never prints"
cat << 'EOF' > ~/doBar.sh
        echo 'nested script doing Bar'
EOF
echo "It never prints too"
#  Here there is no doFoo.sh or doBar.sh in ~

答案2

您的问题陈述意味着您希望找到文件:

doFoo.sh
doBar.sh

在你的主目录中。您的脚本不使用这些名称。您可以通过在每个名称前添加一个点来找到您要查找的文件,如cat脚本中的命令所指定:

$ cd ~
$ ls -l .do*
-rw-------  1 jim  jim  39 Mar 15 14:49 .doBar.sh
-rw-------  1 jim  jim  39 Mar 15 14:49 .doFoo.sh
$ cat .doBar.sh
    echo 'nested script doing Bar'
$ cat .doFoo.sh
    echo 'nested script doing Foo'

编辑:

您指示仅echo执行第一条语句,并且脚本在第一条cat语句中失败。但是,您发布的脚本可以在我的机器上运行。您的文件中可能存在一些不可打印/垃圾字符,这些字符会导致语法错误,但不会显示在您的 StackExchange 帖子中。

尝试完全按照上面显示的方式复制并粘贴脚本,并将其保存到新的文件:

cat << END > newfile.sh
(paste)
END
chmod +x newfile.sh
./newfile.sh

相关内容