这个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
文本保存在 中。nano
nano
-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