Shell Script(三):变量、常量和捕获命令结果
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
一、在本文最开始,先要阐述一下输出方面的内容。例如想要输出如下形式的 HTML 字符串:
<html>
<head>
<title>
The title of your page
</title>
</head>
<body>
Your page content goes here.
</body>
</html>
可以使用每行用一个 echo 命令的方式,如下:
#!/bin/bash
# sysinfo_page - A script to produce an html file
echo "<html>"
echo "<head>"
echo " <title>"
echo " The title of your page"
echo " </title>"
echo "</head>"
echo ""
echo "<body>"
echo " Your page content goes here."
echo "</body>"
echo "</html>"
很明显,这种方式需要重复多次使用 echo 命令,比较繁琐。因此我们可以改用如下稍微简洁一些的方式,如下:
#!/bin/bash
# sysinfo_page - A script to produce an HTML file
echo "<html>
<head>
<title>
The title of your page
</title>
</head>
<body>
Your page content goes here.
</body>
</html>"
即用一个引号将字符串的所有内容括起来。然而这样存在一个问题:当字符串中包含需要转义的字符时需要在该字符前面加反斜杠,这样还是有些麻烦。除此之外,还有一种方法可以使输入更加方便,方式如下:
#!/bin/bash
# sysinfo_page - A script to produce an HTML file
cat << _EOF_
<html>
<head>
<title>
The title of your page
</title>
</head>
<body>
Your page content goes here.
</body>
</html>
_EOF_
上面的写法可以总结成下面的形式:
command << token
content to be used as command's standard input
token
其中,"token" 可以是随意的一个字符串,但注意不要与系统冲突。如上面的例子中 "token" 使用的是 _EOF_
,如果将 _EOF_
替换为 good
仍然能够得到同样的结果。
最后再说一下缩进的问题。如果将上面的输入方式写成下面的形式(注意 "<<" 改成了 "<<-" ):
command <<- token
content to be used as command's standard input
token
这时,字符串每行行首的 TAB 在实际输出时都会被忽略,但注意空格不会被忽略。
二、变量
1、Shell 中变量的命名规则:
(1)必须以字符开头;
(2)不能包含空格,如果想要包含空格,习惯上空格使用下划线代替;
(3)不能包含标点符号。
2、变量的定义和使用
先看一个例子:
#!/bin/bash
# sysinfo_page - A script to produce an HTML file
title="My System Information"
cat <<- _EOF_
<html>
<head>
<title>
$title
</title>
</head>
<body>
<h1>$title</h1>
</body>
</html>
_EOF_
对于稍微有点编程基础的人都能从这个例子中知道 Shell 变量的定义和使用方法。但需要注意以下几点:
(1)定义变量时 "=" 两边不能有空格。
(2)变量的值都是字符串类型的,因此不能直接通过 "+","-","*","/","%" 来参与算数运算(Shell 变量参与算术运算的方法这里先不涉及,即便不使用变量的算术运算,也能解决开发工作中几乎所有项目的部署工作)。
(3)定义只读变量时只需要在变量名前面加 "readonly" 即可,如:
readonly title="My System Information"
只读变量不能被再次赋值,如果强行赋值系统将会报错。
(4)在调用变量时可以使用 $变量名
或者 ${变量名}
的方式,后者是为了帮助解释器明确变量名的边界,比如假设有一个 greeting 变量:
${greeting}bubble
能够被解释器正确解释,但如果写成 $greetingbubble
则会报错。
(5)Linux 系统有很多预定义的变量,如 HOME、HOSTNAME等等。在自定义变量时注意不要与系统变量冲突。
三、常量
在 Shell 中,常量有其自己的定义方式。但在实际使用时总是习惯用全大写的变量名来声明这是一个常量,这个全大写的变量名提示在后续的编码中不要改变它的值。虽然我们依然可以改变变量名全大写的变量值,但按照惯例,我们不要去修改它的值。此外,系统变量也可以看作是常量。
四、捕获命令结果
对于这个知识点,可以举例说明:
right_now=$(date +"%x %r %Z")
time_stamp="Updated on $right_now by $USER"
我们可以使用
variable_name=$(command)
或
variable_name=`command`
的方式来捕获一个命令的返回结果,并将该结果赋值给一个变量。在 bash 脚本中更推荐使用第二种方式,因为它更具有通用性。