本部分内容参考自《Linux命令行与shell脚本编程大全 第3版》。
Shell 脚本中最有用的特性之一就是可以从命令输出中提取信息,并将其赋给变量。把输出赋给变量之后,就可以随意在脚本中使用了。这个特性在处理脚本数据时尤为方便。
有两种方法可以将命令输出赋给变量:
- 反引号字符”`“;
$( command )
格式;
要注意反引号字符,这可不是用于字符串的那个普通的单引号字符。由于在 Shell 脚本之外很少用到,你可能甚至都不知道在键盘什么地方能找到这个字符。但你必须慢慢熟悉它,因为这是许多 Shell 脚本中的重要组件。提示:在美式键盘上,它通常和波浪线( ~)位于同一键位。
命令替换允许你将 Shell 命令的输出赋给变量。尽管这看起来并不那么重要,但它却是脚本编程中的一个主要组成部分。
要么用一对反引号把整个命令行命令围起来:
testing='date'
```bash
要么使用 `$()` 格式:
testing=$(date)
Shell 会运行命令替换符号中的命令,并将其输出赋给变量 `testing`。注意,赋值等号和命令替换字符之间没有空格。这里有个使用普通的 `Shell` 命令输出创建变量的例子。
``` bash
$ cat test4.sh
#!/bin/bash
testing=$(date)
echo "The date and time are: " $testing
变量 testing
获得了 date
命令的输出,然后使用 echo
语句显示出它的值。运行这个 Shell
脚本生成如下输出。
$ ./test4.sh
The date and time are: Tue Dec 17 13:54:00 CST 2019
这个例子毫无吸引人的地方(也可以干脆将该命令放在 echo
语句中),但只要将命令的输出放到了变量里,你就可以想干什么就干什么了。
下面这个例子很常见,它在脚本中通过命令替换获得当前日期并用它来生成唯一文件名。
$ cat test5.sh
#!/bin/bash
today=$(date +%y%m%d)
ls /usr/bin -al > log.$today
today
变量是被赋予格式化后的 date
命令的输出。这是提取日期信息来生成日志文件名常用的一种技术。 +%y%m%d
格式告诉 date
命令将日期显示为两位数的年月日的组合。
$ date +%y%m%d
191217
这个脚本将日期值赋给一个变量,之后再将其作为文件名的一部分。文件自身含有目录列表的重定向输出。运行该脚本之后,应该能在目录中看到一个新文件。
$ ll log.*
-rw-r--r--. 1 root root 65109 Dec 17 13:55 log.191217
目录中出现的日志文件采用 $today
变量的值作为文件名的一部分。日志文件的内容是 /usr/bin
目录内容的列表输出。如果脚本在明天运行,日志文件名会是 log.191218
,就这样为新的一天创建一个新文件。
评论区