Bash函数返回“command not found”

4

我一直在尝试让这个函数正常运行而不返回错误,但是目前我仍然无法弄清问题所在。我正在使用$(report_home_space)将函数的内容插入到一小段html中,但是总是出现错误:report_home_space: 命令未找到,位于第30行。

 report_home_space () {
          cat <<- _EOF_
                  <H2>Home Space Utilization</H2>
                  <PRE>$(du -sh /home/*)</PRE>
                  _EOF_
  }

我是一个新手Shell脚本编程,但我在函数的语法和拼写上没有发现任何错误。谢谢。

完整脚本如下:

#!/bin/bash

# Program to output a system information page

TITLE="System Information Report For $HOSTNAME"
CURRENT_TIME=$(date +"%x %r %z")
TIMESTAMP="Generated $CURRENT_TIME, by $USER"

report_uptime () {
        cat <<- _EOF_
                <H2>system Uptime</H2>
                <PRE>$(uptime)</PRE>
                _EOF_
}

report_disk_space () {
        cat <<- _EOF_
                <H2>Disk Space Ulitilizatoin</H2>
                <PRE>$(df -h)</PRE>
                _EOF_
}

report_home_space () {
        cat <<- _EOF_
                <H2>Home Space Utilization</H2>
                <PRE>$(du -sh /home/*)</PRE>
                _EOF_
}

cat << _EOF_
<HTML>
        <HEAD>
                <TITLE>$TITLE</TITLE>
        <BODY>
                <H1>$TITLE</H1>
                <P>$TIMESTAMP</P>
                $(report_uptime)
                $(report_disk_space)
                $(report_home_space)
        </BODY>
<HTML>
_EOF_

1
一些注意事项:(1)您的空格非常不寻常(即在函数名称后面的括号之间有空格);可能不是无效的,但肯定不是常见的习惯用法。(2)使用<<-是有风险的,因为复制/粘贴过程中很容易将制表符转换为空格;更安全的做法是使用<<并不缩进关闭分隔符,尽管这样看起来很丑。 - Charles Duffy
此外,省略 cat 调用会更有效率(毕竟所有调用都涉及到 fork()/exec() 循环)。考虑使用 printf '%s\n' "<H2>System Uptime</H2>" "<PRE>$(uptime)</PRE>" 或类似的方法。 - Charles Duffy
我刚想打出一条关于printf的建议,但你比我快了 :) - ghoti
@CharlesDuffy 所有建议都已经注意到了。我正在按照我目前学习的书籍中看到的示例进行操作,但我确实能看到使用printf可能会更好。谢谢。 - wrfc
2个回答

4

顺便说一句,你的脚本运行良好。你是否在Windows环境下编写并上传到UNIX环境中? 尝试运行:

dos2unix script.sh

这段代码的作用是将行尾从Windows格式转换为Unix格式。也就是说,它会去掉\r(回车符)来将行尾从\r\n(回车符+换行符)转换为\n(换行符)。
另外,在HTML方面,您的标题标签后缺少"<HEAD>"的闭合标签。 enter image description here

很好的建议,尽管我不确定它是否会导致 OP 提到的错误。从我所看到的脚本中,文本“report_home_space”实际上从未出现在行末,因此流氓的 \r 字符可能会破坏事情的唯一地方是在函数内部(仍将运行)或在 HTML 中(这并不重要)。当然,我还没有测试过。 :-) - ghoti
值得注意的是,在vim中使用哪些选项可以明确查看文件内容。如果OP的系统中没有安装vim,则也可以提到传统vi中的set list选项。 - ghoti
@rurouni88-我正在我的Ubuntu机器上工作,脚本是在那里打的(vim),并在那里运行。感谢你的帮助:) 我确实漏掉了那个<HEAD/>标签。 - wrfc
@ghoti- 喜欢 "set list" 命令。我通常在脚本上运行 cat -A 来获取此视图。 - wrfc
是的,我使用“set listchars=tab:>.,eol:\”和“set list”,这使我能够快速检测出周围是否存在任何有问题的字符 :) - rurouni88
1
原来罪魁祸首是位于我的第二个函数“_EOF_^I$”末尾的制表符。现在一切正常了。谢谢! - wrfc

0
你也可以执行命令 "od -c filename" 或者 "grep pattern filename | od -c" 来查看文件中是否存在任何隐藏字符。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接