1、shell脚本
shell终端解释器可以当作人与计算机硬件之间的“翻译官”,它作为用户与Linux系统内部的通信媒介,除了能够支持各种变量与参数外,还提供了比如循环、分支等高级编程语言才有的控制结构特性。shell脚本命令的工作方式有两种:交互式和批处理。
交互式:用户每输入一条命令就立即执行。
批处理:由用户事先编写好一个完整的shell脚本,shell会一次性执行脚本中诸多的命令。
2、编写shell脚本
2.1、简单的shell脚本
shell脚本由3种不同的元素组成:第一行为脚本声明(#!),用来告诉系统使用哪种shell解释器来执行脚本;第二行为注释信息(#)是对脚本功能或某些命令的介绍信息;后边部分为可执行语句。
下边就是一个简单的shell脚本,主要功能为显示当前目录中文件的信息。
[root@localhost ~]# vim demo.sh
[root@localhost ~]# cat demo.sh
#!/bin/bash
#xxxxxxxxxx message xxxxxxxxx
ls -l
[root@localhost ~]# bash demo.sh
2.2、接收用户的参数
像上边运行的脚本程序只能执行一些预先定义好的功能,为了让shell脚本程序更好地满足用户的一些实时需求,必须让脚本程序能够像之前执行命令时那样,可以接收用户输入的参数,这些其实在shell中已经设置好了。例如:$0表示当前shell脚本程序的名称;$#表示一共有几个参数;$*表示这几个参数各是什么;$?表示上一次命令的返回值;$1、$2、$3...则分别表示对应着第N个位置的参数值。
#!/bin/bash
# xxxxxxxx
echo "Name: $0"
echo "Total: $#"
echo "Values: $*"
echo "Number1: $1"
echo "Number3: $3"
3、判断用户的参数
3.1、测试语句(测试语句格式:[ 条件表达式 ],注意:中括号前后都必须有一个空格!)
按照测试对象来划分,条件测试语句可以分为4种:
文件测试语句即使用指定条件来判断文件是否存在或者权限是否满足等情况,参数如表所示:
参数 | 作用 |
-d | 测试文件是否为目录类型 |
-e | 测试文件是否存在 |
-f | 测试文件是否为一般文件 |
-r | 测试当前用户是否有权限读取 |
-w | 测试当前用户是否有权限写入 |
-x | 测试当前用户时候有权限执行 |
下面通过几个例子来解释一下条件测试语句的基本用法,其中$?的作用为显示上一条命令执行后的返回值。如果返回0,则表示存在;如果返回值为非零,则表示不存在。(其中test、test.sh等测试文件均为自己创建)
[root@localhost ~]# [ -d test ]
[root@localhost ~]# echo $?
0
[root@localhost ~]# [ -f test.sh ]
[root@localhost ~]# echo $?
0
[root@localhost ~]# [ -w message.txt ]
[root@localhost ~]# echo $?
0
[root@localhost ~]# [ -x message.txt ]
[root@localhost ~]# echo $?
1
逻辑测试语句用于对测试结果进行逻辑分析,根据测试结果可实现不同的效果,常用的逻辑判断语句有3种:“与”(&&)、“或”(||)、“非”(!),和数学中的一个道理。
符号 | 作用 |
&& | 两个都为真结果才为真,如果第一个为假,则后面的不执行。 |
|| | 有一个为真则结果为真,如果第一个为真,则后边的不执行。 |
! | 取反结果。 |
和上边的例子使用同一组测试文件,首先判断test是否为目录文件,如果是,则继续执行&&后边的判断,判断test.sh是否为一般文件,如果是,则$?输出为0。
[root@localhost ~]# [ -d test ] && [ -f test.sh ]
[root@localhost ~]# echo $?
0
稍微修改一下代码,把后边的test.sh改为判断是否为目录文件,看一下结果会是怎样?
[root@localhost ~]# [ -d test ] && [ -d test.sh ]
[root@localhost ~]# echo $?
1
我们发现$?的结果变为1,原因就是test.sh不是目录文件,所有后边的判断为假。
为了证明第一个判断语句为假,那么后边的语句将不会执行,我们写这样一个测试语句(echo和“hi”之间有空格)。
“或”(||)语句表示只要其中有一个为真那么结果就为真。
[root@localhost ~]# [ -f test ] || echo "hi"
hi
[root@localhost ~]# [ -f test ] || [ -d test ]
[root@localhost ~]# echo $?
0
“非”(!)语句即取相反的意思。
[root@localhost ~]# [ -d test ]
[root@localhost ~]# echo $?
0
[root@localhost ~]# [ ! -d test ]
[root@localhost ~]# echo $?
1
整数运算比较符仅是对数字进行操作,不能将数字和字符串、文件等内容一起操作。因为等号与赋值命令符冲突,大于号和小于号分别与输出重定向命令符和输入重定向命令符冲突。因此一定要使用规范的整数比较运算符来进行操作。
操作符 | 作用 |
-eq | 是否等于 |
-ne | 是否不等于 |
-gt | 是否大于 |
-lt | 是否小于 |
-ge | 是否大于等于 |
-le | 是否小于等于 |
操作很简单,就是数字之间的比较。
[root@localhost ~]# [ 10 -eq 10 ]
[root@localhost ~]# echo $?
0
[root@localhost ~]# [ 10 -ne 10 ]
[root@localhost ~]# echo $?
1
[root@localhost ~]# [ 10 -le 10 ]
[root@localhost ~]# echo $?
0
字符串比较语句用于判断测试字符串是否为空值,或两个字符串是否相同。它经常用来判断某个变量是否未被定义(即内容为空值),理解起来也比较简单。
操作符 | 作用 |
= | 比较字符串内容是否相同 |
!= | 比较字符串内容是否不同 |
-z | 判断字符串内容是否为空 |
[root@localhost ~]# String=10
[root@localhost ~]# [ -z String ]
[root@localhost ~]# echo $?
1