什么是Shell
Shell是一个命令解释器,它会解释并执行命令行提示符下输入的命令。除此之外,Shell还有另一个功能,如果要执行多条命令,它可以将这组命令存放在一个文件中,然后可以像执行Linux系统提供的其他程序一样执行这个文件,这个命令文件就叫做Shell程序或者Shell脚本。当运行这个文件时,它会像在命令行输入这些命令一样顺序地执行它们。
Shell脚本支持变量、命令行参数、交互式输入、函数模块、各种控制语句等高级编程语言的特性,如if、case、while和for等。利用Shell程序设计语言可以编写出功能非常复杂的脚本程序,把大量的任务自动化,尤其是那些需要输入大量命令而在执行过程中不太需要与用户进行干预的系统管理任务。
为了让Shell能读取并且执行Shell程序,Shell脚本的文件权限必须被设置为可读和可执行。为了让Shell可以找到程序,可以选择输入完全路径名,或者将这个脚本的路径放在PATH环境变量指定的路径列表中。Shell脚本不是复杂的程序,它是由上往下逐行解释执行的。脚本的第一行总是以“#!<Shell解释器文件路径>”开始,用来指定该脚本是使用那种Shell进行解释执行。
编写Shell脚本
1)使用VI或者其他任意的文本编辑工具创建一个名为HelloWorld.sh的文件,并在其中加入以下内容:
[root@localhost ~]# vi HelloWorld.sh#!/bin/bash#The first Shell scriptecho "Hello World!"
2)为HelloWorld.sh文件添加执行权限;
[root@localhost ~]# chmod +x HelloWorld.sh
3)运行HelloWorld.sh脚本,查看运行结果;
[root@localhost ~]# ./HelloWorld.sh Hello World!
条件测试 | 数值测试
编写Shell脚本时,有时要先测试字符串是否一致、数字是否相等或者检查文件状态,基于这些测试的结果再做下一步的操作。Shell脚本的条件测试可以用于测试字符串、文件状态和数字。
测试完成后可以通过“$?”获取测试的结果,其中0为正确,1为错误。
数值测试用于对两个数值进行比较并得出判断结果,包括:等于、不等于、大于、大于等于、小于、小于等于。
数值判断的格式:[ 数值1 关系运算符 数值2 ]
方括号与条件之间必须要有空格。
数值测试的关系运算符 | |
关系运算符 | 说明 |
-eq | 两个数值相等 |
-ne | 两个数值不相等 |
-gt | 第一个数大于第二个数 |
-lt | 第一个数小于第二个数 |
-ge | 第一个数大于等于第二个数 |
-le | 第一个数小于等于第二个数 |
测试两个数值是否相等;
[root@localhost ~]# [ 1024 -eq 1024 ] //测试1024是否等于1024[root@localhost ~]# echo $?0 //两个数值相等修改第一个数值为1124后再次进行测试。[root@localhost ~]# [ 1124 -eq 1024 ][root@localhost ~]# echo $?1 //两个数值不相等[root@localhost ~]# number1=500 //number1为500[root@localhost ~]# number2=254 //number2为254[root@localhost ~]# [ $number1 -gt $number2 ][root@localhost ~]# echo $?0 //number1大于number2[root@localhost ~]#
条件测试 | 字符串测试
字符串测试可以对两个字符串的值进行比较,也可以测试单个字符串的值是否为空或者非空。
字符串测试的格式:[ 关系运算符 字符串 ]或者[ 字符串1 关系运算符 字符串2 ]
字符串测试的关系运算符 | |
关系运算符 | 说明 |
= | 两个字符串相等 |
!= | 两个字符串不相等 |
-z | 字符串为空 |
-n | 字符串不为空 |
要测试两个字符串是否相等[root@localhost ~]# [ "abc" = "abc" ][root@localhost ~]# echo $?0 //两个字符串相等把第一个字符串更改为bac后进行测试[root@localhost ~]# [ "bac" = "abc" ][root@localhost ~]# echo $?1 //两个字符串不相等如果把运算符改为“!=”[root@localhost ~]# [ "bac" != "abc" ][root@localhost ~]# echo $?0判断环境变量是否为空或者非空[root@localhost ~]# [ -z $python1 ][root@localhost ~]# echo $?0[root@localhost ~]# [ -n $python1 ][root@localhost ~]# echo $?0 //python1变量为空[root@localhost ~]# python1="test" //对python1变量进行赋值[root@localhost ~]# [ -z $python1 ][root@localhost ~]# echo $?1 //python1变量不为空[root@localhost ~]#
条件测试 | 文件状态测试
Linux的Shell脚本支持对文件状态的检测,包括检测文件的类型、文件的权限和文件的长度等;文件状态测试的格式:[ 关系运算符 字符串 ]
文件状态测试的关系运算符 | |
关系运算符 | 说明 |
-d | 目录 |
-f | 一般文件 |
-L | 链接文件 |
-r | 可读 |
-w | 可写 |
-x | 可执行 |
-u | 设置了suid |
-s | 文件长度大于0、非空 |
[root@localhost 20190105]# ll总用量 4-rwxr-xr-x. 1 root root 56 6月 4 07:55 HelloWorld.sh[root@localhost 20190105]# [ -r HelloWorld.sh ][root@localhost 20190105]# echo $?0 //HelloWorld.sh 文件可读[root@localhost 20190105]# [ -w HelloWorld.sh ][root@localhost 20190105]# echo $?0 //HelloWorld.sh 文件可写[root@localhost 20190105]# [ -x HelloWorld.sh ][root@localhost 20190105]# echo $?0 //HelloWorld.sh 文件可执行[root@localhost 20190105]#
条件测试的逻辑操作符
逻辑操作符分以下3种:
-
-a:逻辑与,只有当操作符两边的条件均为真时,结果为真,否则为假。
-
-o:逻辑或,操作符两边的条件只要有一个为真,结果为真,只有当两边所有条件为假时,结果为假。
-
!:逻辑否,条件为假,结果为真。
如果要测试两个文件的状态[root@localhost 20190105]# ll test1 test2-rw-rw-r--. 1 root root 0 6月 4 09:25 test1-rw-rw-r--. 1 root root 0 6月 4 09:25 test2[root@localhost 20190105]# [ -r test1 -a -r test2 ] //测试文件 test1 和 test2 是否都可读[root@localhost 20190105]# echo $?0[root@localhost 20190105]# [ -x test1 -o -x test2 ] //测试文件 test1 和 test2 是否至少有一个可执行[root@localhost 20190105]# echo $?1如果要测试两个数值变量[root@localhost 20190105]# number1=10[root@localhost 20190105]# number2=20[root@localhost 20190105]# [ $number1 -eq 10 -a $number2 -gt 20 ] //测试是否number1 大于10 且 number2 大于20[root@localhost 20190105]# echo $?1如果要测试文件test1 是否为不可读[root@localhost 20190105]# ls -l test1-rw-rw-r--. 1 root root 0 6月 4 09:25 test1[root@localhost 20190105]# [ ! -r test1 ] //测试文件test1 是否为不可读[root@localhost 20190105]# echo $?1[root@localhost 20190105]#