[TOC]
编写Shell脚本
Shell脚本命令的工作方式分为两种:交互式和批处理
- 交互式(Interactive):用户每输入一条命令就立即执行
- 批处理(Batch):由用户事先编写好一个完整的Shell脚本,Shell会一次性执行脚本中的诸多的命令
1、编写简单的脚本
如果想查看当前所在工作路径并列出当前目录下所有的文件及属性信息,实现这个功能的脚本如下:
[root@centos7-01 doc]# vim example.sh
#!/bin/bash
#For Example BY linuxprobe.com
pwd
ls -al
Shell脚本文件的名称可以任意,但为了避免被误以为是普通文件,建议将.sh
后缀加上,以表示是一个脚本文件
在上面的example.sh脚本中出现了三种不同的元素:
-
第一行
#!
:脚本声明#!
用来告诉系统用哪种 Shell 解释器来执行脚本 -
第二行
#
:注释信息#
是对脚本功能和某些命令的介绍信息 - 第三、第四行 :为可执行语句
执行脚本有两种方式:
-
第一种 :执行命令
bash example.sh
,即可执行脚本 - 第二种 :通过输入脚本完整路径的方式执行,但默认会因为权限不足而提示报错,此时为脚本文件增加执行权限即可
# 示例---路径执行脚本
[root@centos7-01 doc]# ./example.sh
-bash: ./example.sh: 权限不够
[root@centos7-01 doc]# chmod u+x example.sh
[root@centos7-01 doc]# ./example.sh
/doc
总用量 8
drwxr-xr-x. 2 root root 44 12月 11 16:37 .
dr-xr-xr-x. 18 root root 235 12月 11 10:17 ..
-rwxr--r--. 1 root root 49 12月 11 16:37 example.sh
-rw-r--r--. 1 root root 56 12月 11 10:22 practice.txt
2、接受用户的参数
Linux 内设了用于接受参数的变量,变量之间可以使用空格间隔。
各变量的作用:
-
$0
:对应当前Shell脚本程序的名称 -
$#
:对应总共有几个参数 -
$*
:对应所有位置参数 -
$?
:对应显示上一次命令的执行返回值 -
$1、$2、$3...
:分别对应着第 N 个位置的参数值
# 示例---变量参数
[root@centos7-01 doc]# vim example.sh
#!/bin/bash
# For Example BY chenchen
echo "当前脚本名称为$0"
echo "总共有$#个参数,分别是$*"
echo "第一个参数为$1,第二个参数为$2,...,第5个参数为$5"
[root@centos7-01 doc]# sh example.sh one two three four five six
当前脚本名称为example.sh
总共有6个参数,分别是one two three four five six
第一个参数为one,第二个参数为two,...,第5个参数为five
3、判断用户的参数
Shell脚本中条件测试语法可以判断表达式是否成立,若条件成立则返回数字0,否则便返回其他随机数值,条件测试语法的执行格式如下:
测试语句格式:[ 条件表达式 ]
切记,表达式两边均应有一个空格
3.1 条件测试语句划分---按测试对象分4种
- 文件测试语句
- 逻辑测试语句
- 整数值比较语句
- 字符串比较语句
3.2 文件测试所用的参数
-
-d
:测试文件是否为目录类型 -
-e
:测试文件是否存在 -
-f
:判断是否为一般文件 -
-r
:测试当前用户是否有权限读取 -
-w
:测试档当前用户是否有权限写入 -
-x
:测试当前用户是否有权限执行
3.2.1 测试 $?
用测试语句测试一个文件是否为目录,然后通过 Shell 解释器内设 $? 变量显示上一条命令的返回值
[root@study doc]# [ -d /doc ]
[root@study doc]# echo $?
0
[root@study doc]# [ -d /doc/example.sh ]
[root@study doc]# echo $?
1
3.2.2 测试一个文件是否为一般文件
[root@study doc]# [ -f /doc/example.sh ]
[root@study doc]# echo $?0
1
3.3 逻辑语句
3.3.1 逻辑“与”&&
在Shell终端中逻辑“与”的运算符号是&&
,它表示当前面的命令执行成功后才执行后面的命令
[root@study ~]# [ -e /doc/example.sh ] && echo "存在"
存在
3.3.2 逻辑“或”||
等号两边必须要有空格,才能进行逻辑等于
[root@study ~]# echo $USER
root
[root@study ~]# [ $USER=root ] || echo "user"
[root@study ~]# su - chen
Last login: Wed Dec 12 09:06:43 CST 2018 on pts/0
[chen@study ~]$ [ $USER=root ] || echo "user"
[chen@study ~]$ echo $USER
chen
[chen@study ~]$ [ $USER = root ] || echo "user"
user
3.3.3 逻辑“非”!
它表示把条件测试中的判断结果取相反值
[chen@study ~]$ exit
logout
[root@study ~]# [ $USER != root ] || echo "administrator"
administrator
3.3.4 与、或、非 综合示例
[root@study ~]# [ $USER != root ] && echo "user" || echo "root"
root
3.4 整数比较运算符
整数比较运算符仅对数字操作,且不能使用等号、大于号、小于号来判断。因为等号与赋值命令符冲突,大于号和小于号分别与输出重定向和输入重定向命令符冲突。因此一定要使用规范的整数比较运算符进行操作。
-
-eq
:是否等于 -
-ne
:是否不等于 -
-gt
:是否大于 -
-lt
:是否小于 -
-le
:是否等于或小于 -
-ge
:是否大于或等于
[root@study ~]# [ 10 -gt 10 ]
[root@study ~]# echo $?
1
[root@study ~]# [ 10 -eq 10 ]
[root@study ~]# echo $?
0
示例:使用 free -m
命令查看内存使用量情况(单位MB),然后通过 grep Mem:
命令过滤出剩余内存量的行,使用 awk'{print $4}'
命令只保留第四列,最后用 FreeMem=`语句`
的方式把语句内执行结果复制给变量
[root@study ~]# free -m
total used free shared buff/cache available
Mem: 488 47 23 0 417 417
Swap: 0 0 0
[root@study ~]# free -m | grep Mem
Mem: 488 47 23 0 417 417
[root@study ~]# free -m | grep Mem: | awk '{print $4}'
23
[root@study ~]# FreeMem=`free -m | grep Mem: | awk '{print $4}'`
[root@study ~]# echo $FreeMem
22
[root@study ~]# [ $FreeMem -lt 1024 ] && echo "Insufficient Memory(内存不足)"
Insufficient Memory(内存不足)
3.5 常见的字符串比较运算符
-
=
:比较字符串内容是否相同 -
!=
:比较字符串内容是否不同 -
-z
:判断字符串内容是否为空
示例1:判断String变量是否为空,进而判断是否定义了这个变量
[root@study ~]# [ -z $String ]
[root@study ~]# echo $?
0
示例2:引入逻辑运算符,判断语系LANG
[root@study ~]# echo $LANG
en_US.UTF-8
[root@study ~]# [ $LANG != "zh_CN.UTF-8" ] && echo "Not zh_CN(LANG不是汉语)"
Not zh_CN(LANG不是汉语)
网友评论