1.shell的组成
- 脚本声明 #!/bin/bash
- 脚本注释 以#开头
- 脚本命令 实现脚本的功能
2.分类
交互式(Interactive):用户每输入一条命令就立即执行。
批处理(Batch):由用户事先编写好一个完整的Shell脚本,Shel会一次性执行脚本中诸多的命令
shell脚本文件,建议将.sh后缀加上, 以表示是一个脚本文件。
3.运行脚本的方法
- 用Bash解释器命令直接运行Shell脚本文件
- 通过输入完整路径的方式来执行。但默认会因为权限不足而提示报错信息,此时只需要为脚 本文件增加执行权限即可
4.编写简单的脚本
查看当前所在工作路径并列出当前目录下所有的文件及属性信息
[root@localhost ~]# cat cat.sh
#!/bin/bash
#查看当前所在工作路径并列出当前目录下所有的文件及属性信息
pwd
ls -al
[root@localhost ~]# bash cat.sh
/root
total 2097256
dr-xr-x---. 22 root root 4096 Jan 21 10:20 .
dr-xr-xr-x. 18 root root 235 Jan 20 16:34 ..
-rw-r--r--. 1 root root 312 Jan 19 18:58 111
drwxr-xr-x. 2 root root 6 Jan 19 11:41 123
drwxr-xr-x. 2 root root 6 Jan 19 11:24 2
[root@localhost ~]# ./cat.sh
-bash: ./cat.sh: Permission denied
[root@localhost ~]# chmod +x cat.sh
[root@localhost ~]# ./cat.sh
/root
total 2097256
dr-xr-x---. 22 root root 4096 Jan 21 10:20 .
dr-xr-xr-x. 18 root root 235 Jan 20 16:34 ..
-rw-r--r--. 1 root root 312 Jan 19 18:58 111
drwxr-xr-x. 2 root root 6 Jan 19 11:41 123
5.接收用户的参数
shell脚本内设了用于接收参数的变量,变量之间使用空格间隔。
$0 对应的是当前 Shell 脚本程序的名称,
$#对应的是总 共有几个参数,
$*对应的是所有位置的参数值,
$?对应的是显示上一次命令的执行返回值,
而$1、$2、$3……则分别对应着第N个位置的参数值
[root@localhost ~]# cat example.sh
#!/bash/sbin
#接收用户的参数
echo "当前脚本的名字是:$0"
echo "总共有$#个参数,分别是$*"
echo "第一个参数为$1,第五个参数为$5"[root@localhost ~]# bash example.sh one two three four five six
当前脚本的名字是:example.sh
总共有6个参数,分别是one two three four five six
第一个参数为one,第五个参数为five
[root@localhost ~]#
6.判断用户的参数
Shell脚本中的条 件测试语法可以判断表达式是否成立,若条件成立则返回数字0,否则便返回非零值。切记,条件表达式两边均应有一个空格。
按照测试对象来划分,条件测试语句可以分为4种:
-
文件测试语句
-d 测试文件是否为目录类型
-e 测试文件是否存在
-f 判断是否为一般文件
-r 测试当前用户是否有权限读取
-w 测试当前用户是否有权限写入
-x 测试当前用户是否有权限执行
使用文件测试语句来判断/etc/是否为一个目录类型的文件, 然后通过Shell解释器的内设$?变量显示上一条命令执行后的返回值。
如果返回值为0,则目录存在;如果返回值 为非零的值,则意味着它不是目录,或这个目录不存在:
[root@localhost ~]# [ -d /etc ]
[root@localhost ~]# echo $?
127
使用文件测试语句来判断/etc是否为一般文件,如果返回值为 0,则代表文件存 在,且为一般文件:
[root@localhost ~]# [ -f /etc ]
[root@localhost ~]# echo $?
1
逻辑测试语句
逻辑与
在Shell 终端中逻辑“与”的运算符号是&&,它表示当前面的命令执行成功后才会执行它后面的命令, 因此可以用来判断/dev/cdrom文件是否存在,若存在则输出Exist字样。
[root@localhost ~]# [ -e /dev/cdrom ] && echo "Exist"
Exist
逻辑或
逻辑“或”,它在 Linux 系统中的运算符号为||,表示当前面的命令执行失败后才会执行它后面的命令,因此可以用来结合系统环境变量USER来判断当前 登录的用户是否为非管理员身份:
[trick@localhost ~]$ [ $USER = root ] || echo user
user
逻辑非
逻辑“非”,在Linux系统中的运算符号是一个叹号(!),它表示把条件测 试中的判断结果取相反值。
!真=假
!假=真
如果原本测试的结果是正确的,则将其变成错误的; 原本测试错误的结果,则将其变成正确的。
现在切换回到root管理员身份,再判断当前用户是否为一个非管理员的用户。由于 判断结果因为两次否定而变成正确,因此会正常地输出预设信息:
[root@localhost ~]# echo $USER
root
[root@localhost ~]# [ ! $USER = root ] || echo "administrator"
administrator
当前登录用户root,先判断当前 登录用户的USER 变量名称是否等于root,
然后用逻辑“非”运算符进行取反操作,效果就 变成了判断当前登录的用户是否为非管理员用户。
最后若条件成立,则会根据逻辑“与”运 算符输出user字样;
若条件不满足,则会通过逻辑“或”运算符输出root字样,而只有在前面的&&不成立时才会执行后面的||符号。
[root@localhost ~]# [ ! $USER = root ] && echo "user" || echo "root"
root
整数值比较语句
整数比较运算符仅是对数字的操作,不能将数字与字符串、文件等内容一起操作
可用的整数比较运算符
-eq 是否等于
-ne 是否不等于
-gt 是否大于
-lt 是否小于
-le 是否等于或小于
-ge 是否大于或等于
10是否大于10以及10是否等于10
[root@localhost ~]# [ 10 -eq 10 ]
[root@localhost ~]# echo $?
0
[root@localhost ~]# [ 10 -gt 10 ]
[root@localhost ~]# echo $?
1
输出系统剩余内存
先使用free -m命令查看内存使用量情况(单位为MB),然后通过“grep Mem:”命令 过滤出剩余内存量的行,再用awk '{print $4}'命令只保留第4列。
[root@localhost ~]# free -mtotal used free shared buff/cache available
Mem: 1966 979 376 10 610 799
Swap: 2047 0 2047
[root@localhost ~]# free -m | grep Mem | awk '{ print $4}'
376
建议把输出结果赋值给一个变量,以方便其 他命令进行调用:
[root@localhost ~]# FreeMem=`free -m | grep Mem: | awk '{print $4}'`
[root@localhost ~]# echo $FreeMem
362
使用整数运算符来判断内存可用量的值是否小于1024,若小 于则会提示内存不足的字样:
[root@localhost ~]# [ $FreeMem -lt 1024 ] && echo "内存不足"
内存不足
字符串比较运算符
用于判断测试字符串是否为空值,或两个字符串是否相同。它经常用来 判断某个变量是否未被定义(即内容为空值)
= 比较字符串内容是否相同
!= 比较字符串内容是否不同
-z 判断字符串内容是否为空
来通过判断Trick变量是否为空值,进而判断是否定义了这个变量:
[root@localhost ~]# [ -z $Trick ]
[root@localhost ~]# echo $?
0
当用于保存当前语系的环境变量值LANG不是英语 (en.US)时,则会满足逻辑测试条件并输出“不是英语”的字样:
[root@localhost ~]# [ ! $LANG = "en.US" ] && echo "不是英语"
不是英语
[root@localhost ~]#