在我们的最后课程中,我们学到如何创建变量并执行替代它们。在这个课程中,我们将展开这个想法来展示我们如何通过一个命令来替代结果。
当我们持续离开我们脚本,它能够创建一个包含一些简单几行文本的HTML页面,包含了我们从环境变量HOSTNAME获取到的主机名称。下一步,我们将向页面添加时间栈来表示它什么时候最后升级,除了用户做它。
#!/bin/bash
 
# make_page - A script to produce an HTML file
 
title="System Information for"
 
cat <<- _EOF_
    <HTML>
    <HEAD>
        <TITLE>
        $title $HOSTNAME
        </TITLE>
    </HEAD>
 
    <BODY>
    <H1>$title $HOSTNAME</H1>
    <P>Updated on $(date +"%x %r %Z") by $USER
    </BODY>
    </HTML>
_EOF_
正如你能看到的,我们使用了另外一个环境变量, USER来获得用户名。另外,我们使用了这个奇怪的表示:
$(date +"%x %r %Z")
字符”$()” 告诉shell替代被附上命令的结果。在我们脚本里,我们想让shell插入表达当前日期和时间的命令date +"%x %r %Z"的结果。命令date 有许多特性和格式选项。要想全部看到它们,尝试这个:
[me@linuxbox me]$ date --help | less
需要意识到有一个更老的,交替的语法针对”$(命令)”来使用符号” ` ”。这个更老的形式是与最初的Bourne shell(sh)一致的。自从我在这儿教bash,我就不再使用这种老的形式,非sh,而且,我认为` 符号很丑。Bash shell完全支持为sh写的脚本,所以接下来的形式是相等的:
$(command)
`command`
--help 和其他技巧
你怎样学习命令?那么,除了在LinuxCommand.org上阅读它们,你还可能对其他有疑问的命令使用man 页面。LinuxCommand.org上的SuperMan Pages包含了一组完整的流行Linux版本。但是要是命令没有man 页面又怎么样呢?
首先要尝试”--help”。所有的工具由自由软件基金会执行这个选择的GNU项目写成。 要获得一个命令选项的摘要,仅需要输入:
[me@linuxbox me]$ command –help
许多命令(除了GNU工具)将会任一接受 –help选项或者将它看作是一个无效的选项然后将显示你发现的同样有用的消息。
如果--help选项的结果在屏幕中显示不完整,使用less这个管道命令像这样:
[me@linuxbox me]$ command --help | less
有些命令没有帮助信息或不使--help来引用它们。对于这些诡异的命令,我使用这个技巧:
首先,找出可执行文件所存放的地址(这个技巧仅会同程序一道工作,而不是shell集成)。这可以简单的输入为:
[me@linuxbox me]$ which command
Which 命令会告诉你可执行文件的路径和文件名。接下来,使用strings命令来显示文本可能会同可执行文件一起植入。例如,如果你想看到bash程序的内部,你就会做如下:
[me@linuxbox me]$ which bash
/bin/bash
[me@linuxbox me]$
strings /bin/bash
Strings 命令会显示任意程序内部的易于人可读的内容。这可能包含版权标志,错误信息,帮助文本等等。
最后,如果你非常的好奇,获取命令来源并读取它。即使你不能完全地理解由命令所写的程序语言,你可能会通过阅读作者在源代码上的注释来获得珍贵的洞察力。
将一个命令的结果分配给一个变量
你也可以将一个命令的结果分配给一个变量:
right_now=$(date +"%x %r %Z")
你甚至可以嵌套变量(把一个放在另一个里面),像这样:
right_now=$(date +"%x %r %Z")
time_stamp="Updated on $right_now by $USER"

常量
如同名字变量的建议,一个变量的内容受变化的支配。这就是说它是被期望在你的脚本执行过程中,一个变量的内容可能被你所做的一些事改变。
另一方面,可能有些价值,一旦设置,将绝不会再改变。这些被叫做常量。我提及这个是因为它在程序中是一个普遍的想法。大部分程序语言有特别的便利来支持不允许改变的价值。Bash 也有这些能力,但是,坦诚地说,我从没见过它使用过。相反,如果一个数值被确定为常量,它会简单的被赋予为大写的名字。环境变量通常被认为是常量自从它们很少被改变。像常量一样,环境变量按照协定被赋予大写字母。在接下来的脚本中,我会使用这个协定 常量为大写字母并且变量为小写字母。
所以我们所知的每一件事,我们的程序像这样:
#!/bin/bash
 
# make_page - A script to produce an HTML file
 
TITLE="System Information for $HOSTNAME"
RIGHT_NOW=$(date +"%x %r %Z")
TIME_STAMP="Updated on $RIGHT_NOW by $USER"
 
cat <<- _EOF_
    <HTML>
    <HEAD>
        <TITLE>
        $TITLE
        </TITLE>
    </HEAD>
 
    <BODY>
    <H1>$TITLE</H1>
    <P>$TIME_STAMP
    </BODY>
    </HTML>
_EOF_