24. 启动一个项目
2019-02-06 本文已影响14人
独木舟的木
[TOC]
编写一个报告生成器程序。它会显示系统的各种统计数据和它的状态,并将产生 HTML 格式的报告,所以我们能通过网络浏览器,比如说 Firefox 或者 Konqueror,来查看这个报告。
第一阶段:最小的文档
一个规则的 HTML 文档格式如下:
<HTML>
<HEAD>
<TITLE>Page Title</TITLE>
</HEAD>
<BODY>
Page body.
</BODY>
</HTML>
创建目录,并输入程序:
# 创建文件夹
$ mkdir bin
# 打开 vim 编辑器
$ vim sys_info_page
输入如下程序:
#!/bin/bash
# Program to output a system information page
echo "<HTML>"
echo " <HEAD>"
echo " <TITLE>Page Title</TITLE>"
echo " </HEAD>"
echo " <BODY>"
echo " Page body."
echo " </BODY>"
echo "</HTML>"
保存文件,设置为可执行文件,再尝试运行:
# 755,每个人都能执行
chmod 755 ~/bin/sys_info_page
# 运行
./sys_info_page
# 把程序的输出重定向到文件 sys_info_page.html 中
./sys_info_page > sys_info_page.html
# 通过网络浏览器查看输出结果
firefox sys_info_page.html
实际上,程序可以更简单些,合并 echo
命令:
#!/bin/bash
# Program to output a system information page
echo "<HTML>
<HEAD>
<TITLE>Page Title</TITLE>
</HEAD>
<BODY>
Page body.
</BODY>
</HTML>"
第二阶段:添加一点儿数据
#!/bin/bash
# Program to output a system information page
echo "<HTML>
<HEAD>
<TITLE>System Information Report</TITLE>
</HEAD>
<BODY>
<H1>System Information Report</H1>
</BODY>
</HTML>"
变量和常量
变量名规则:
- 变量名可由字母数字字符(字母和数字)和下划线字符组成。
- 变量名的第一个字符必须是一个字母或一个下划线。
- 变量名中不允许出现空格和标点符号。
- shell 不能辨别变量和常量;一个常用惯例是指定大写字母来表示常量,小写字母表示真正的变量。
#!/bin/bash
# Program to output a system information page
TITLE="System Information Report For $HOSTNAME"
echo "<HTML>
<HEAD>
<TITLE>$title</TITLE>
</HEAD>
<BODY>
<H1>$title</H1>
</BODY>
</HTML>"
给变量和常量赋值
shell 不会在乎变量值的类型;它把它们都看作是字符串。通过使用带有 -i 选项的 declare 命令,你可以强制 shell 把赋值限制为整型,但是,正如像设置变量为只读一样,极少这样做。
varible=value
⚠️ 在赋值过程中,变量名,等号和变量值之间必须没有空格。
示例:
a=z # Assign the string "z" to variable a.
b="a string" # Embedded spaces must be within quotes.
c="a string and $b" # Other expansions such as variables can be
# expanded into the assignment.
d=$(ls -l foo.txt) # Results of a command.
e=$((5 * 7)) # Arithmetic expansion.
f="\t\ta string\n" # Escape sequences such as tabs and newlines.
a=5 b="a string" # 可以在同一行中对多个变量赋值
在参数展开过程中,变量名可能被花括号 “{}” 包围着。
#!/bin/bash
# Program to output a system information page
TITLE="System Information Report For $HOSTNAME"
CURRENT_TIME=$(date +"%x %r %Z")
TIME_STAMP="Generated $CURRENT_TIME, by $USER"
echo "<HTML>
<HEAD>
<TITLE>$TITLE</TITLE>
</HEAD>
<BODY>
<H1>$TITLE</H1>
<P>$TIME_STAMP</P>
</BODY>
</HTML>"
我们已经知道了两种不同的文本输出方法,两种方法都使用了 echo 命令。还有第三种方法,叫做 here document 或者 here script。一个 here document 是另外一种 I/O 重定向形式,我们在脚本文件中嵌入正文文本,然后把它发送给一个命令的标准输入。
在 here documents 中,单引号和双引号会失去它们在 shell 中的特殊含义。
# command 是一个可以接受标准输入的命令名。
# token 是一个用来指示嵌入文本结束的字符串。
command << token
text
token
修改示例:
#!/bin/bash
# Program to output a system information page
TITLE="System Information Report For $HOSTNAME"
CURRENT_TIME=$(date +"%x %r %Z")
TIME_STAMP="Generated $CURRENT_TIME, by $USER"
cat << _EOF_
<HTML>
<HEAD>
<TITLE>$TITLE</TITLE>
</HEAD>
<BODY>
<H1>$TITLE</H1>
<P>$TIME_STAMP</P>
</BODY>
</HTML>
_EOF_
使用 cat 命令和一个 here document。
字符串 EOF(意思是 “文件结尾”, 一个常见用法)被选作为 token,并标志着嵌入文本的结尾。注意这个 token 必须在一行中单独出现,并且文本行中没有末尾的空格。
#!/bin/bash
# Script to retrieve a file via FTP
FTP_SERVER=ftp.nl.debian.org
FTP_PATH=/debian/dists/lenny/main/installer-i386/current/images/cdrom
REMOTE_FILE=debian-cd_info.tar.gz
ftp -n << _EOF_
open $FTP_SERVER
user anonymous me@linuxbox
cd $FTP_PATH
hash
get $REMOTE_FILE
bye
_EOF_
ls -l $REMOTE_FILE
如果我们把重定向操作符从 “<<” 改为 “<<-”,shell 会忽略在此 here document 中开头的 tab 字符。 这就能缩进一个 here document,从而提高脚本的可读性:
#!/bin/bash
# Script to retrieve a file via FTP
FTP_SERVER=ftp.nl.debian.org
FTP_PATH=/debian/dists/lenny/main/installer-i386/current/images/cdrom
REMOTE_FILE=debian-cd_info.tar.gz
ftp -n <<- _EOF_
open $FTP_SERVER
user anonymous me@linuxbox
cd $FTP_PATH
hash
get $REMOTE_FILE
bye
_EOF_
ls -l $REMOTE_FILE