重要回顾
- 在创建 shell 脚本文件时,必须在文件的第一行指定要使用的 shell。其格式为,
# !/bin/bash
shell 脚本的关键在于输入多个命令并处理每个命令的结果,甚至需要将一个命令的结果传给另一个命令。shell 可以让你将多个命令串起来,一次执行完成。如果要两个命令一起运行,可以把它放在同一行中,彼此间用分号隔开。
- 用户变量
用户变量可以是任何由字母、数字或下划线组成的文本字符串,长度不超过 20 个,用户变量区分大小写,所以变量 Var1 和变量 var1 是不同的。这个小规矩经常让脚本编程初学者感到头疼。
使用等号将值赋给用户变量。在变量、等号和值之间不能出现空格(另一个困扰初学者的用法)。
shell 脚本会自动决定变量值的数据类型。在脚本的整个生命周期里,shell 脚本中定义的变量会一直保持着它们的值,但在 shell 脚本结束时会被删除掉。
进阶内容
1. 命令替换
shell 脚本中最有用的特性之一就是可以从命令输出中提取信息,并将其赋值给变量。把输出赋给变量之后,就可以随意在脚本中使用了。这个特性在处理脚本数据时尤为方便。有两种方法可以将命令输出赋给变量:
- 反引号(`)
testing=`date`
- $()格式
testing=$(date)
PS:在命令行提示符下使用路径 ./ 运行命令的话,也会创建出子 shell;要是运行命令的时候不加入路径,就不会创建子 shell。如果你使用的是内建的 shell 命令,并不会涉及子 shell。在命令行提示符下运行脚本时一定要留心!
2. 输出重定向
最基本的重定向将命令的输出发送到一个文件中。bash shell 用大于号(>)来完成这项功能。
date > test6
如果输出文件已经存在,重定向操作符会用新的文件数据覆盖已有文件。
有时,你可能并不想覆盖文件原有内容,而是想要将命令的输出追加到已有文件中,比如你正在创建一个记录系统上某个操作的日志文件。在这种情况下,可以用双大于号(>>)来追加数据。
who >> test6
PS:原来双大于号(>>)是用来追加数据的。
3. 输入重定向
内联输入重定向符号是远小于(<<)。除了这个符号,你必须指定一个文本标记来划分输入数据的开始和结尾。任何字符串都可作为文本标记,但在数据的开始和结尾文本标记必须一致。
在命令行上使用内联输入重定向时,shell 会用 PS2 环境变量中定义的次提示符来提示输入数据。次提示符会持续提示,以获取更多的输入数据,知道你输入了作为文本标记的那个字符串。
wc << EOF
> test string 1
> test string 2
> test string 3
> EOF
这里用到的 wc 命令的作用是对数据中的文本进行计数。默认情况下,它会输出 3 个值:
- 文本的行数
- 文本的词数
- 文本的字节数
PS:以前在看技术博客时,一直对【<< EOF】的用法很不解,然后又不知道是什么意思,也不知道怎么百度(当然了,也不想百度,毕竟一般来说找技术博客时是为了更重要更紧急的工作上的事)。现在算是彻底明白了,以下是内联输入重定向(inline input redirection)(好了,知道这叫啥了)的命令格式:
command << marker
data
marker
也就是说,EOF 可以替换成任意其他字符串。它的作用只是作为一个结束的标记。比如,
可以看到结果【3 9 42】和上面是一样的,都是 3 行,9 个单词,42 个字节。
4. 管道
和命令替换所用的反引号(`)一样,管道符号在 shell 编程之外也很少用到。管道被放在命令之间,将一个命令的输出重定向到另一个命令中:
command1 | command2
不要以为由管道串起的两个命令会依次执行。Linux 系统实际上会同时运行这两个命令,在系统内部将它们连接起来。在第一个命令产生输出的同时,输出回被立即送给第二个命令。数据传输不会用到任何中间文件或缓冲区。
5. 执行数学运算
bash shell 为了保持跟 Bourne shell 的兼容而包含了 expr 命令,但它同样也提供了一种更简单的方法来执行数学表达式。
在 bash 中,在将一个数学运算符结果赋给某个变量时,可以用美元符合方括号($[ operation ])将数学表达式围起来。注意在使用方括号来计算公式时,不用担心 shell 会误解乘号或其他符号。shell 知道它不是通配符,因为它在方括号内。
var1=$[ 1 + 5 ]
echo $var1
var2=$[ ${var1} * 2 ]
echo ${var2}
PS:bash shell 数学运算支持整数运算。若要进行任何实际的数学运算,这是一个巨大的限制。
一点废话,技术党略过
最近在学习《Linux 命令行与 shell 脚本编程大全》,花了两天时间把最基础的那部分过完了,之前学习过,这次过知识点时,很轻松,巩固了下知识,也从中学习到了以前遗漏的,和掌握的不好的知识。比如 vim 的一些高级用法,详见上一篇155. 【Linux】 vim 文本编辑器。
这次学习到“构建基本脚本”时,收获同样很大,可能是之前学习的不牢固,但我更觉得这正是证明了自己的学习方法是非常契合自己的!这块以后有机会再好好聊聊。