灵魂三问:
1.什么是shell脚本?
shell是一门语言,和js类似,不需要经过编译就可以运行。
2.为什么要使用shell脚本?
当在linux系统中要执行多条高频率的命令时,不能每次都Ctro + C、Ctro + V,可以通过一个可执行、可保存数据的文件将要高频执行的命令行保存起来,方便后续使用。
3.如何编写shell脚本?
↓ ↓ ↓ ↓ ↓ ↓ ↓
一、Shell脚本的语法
Shell是一门语言,每一种语言都有自己的语法,例如:Java、C、C#等。学会Shell的语法,对于Shell脚本的编写至关重要。
1.shell中的系统预设变量
常用系统变量包括:$USER
、$HOME
、$PWD
、$SHELL
等,可以使用echo命令输出它们的值。使用set
命令可以查看所有系统预定义变量。
2.用户自定义变量
用户根据需求自定义的变量:username=admin,password=123456
不论是系统预设变量还是自定义变量,都可以通过echo来进行输出。
对于用户自定义的变量,可以通过unset进行撤销,即撤销前的变量可以正常使用,撤销后,变量无法使用,会报错!
3.定义静态变量
Shell中的静态变量的定义是通过readonly来实现:readonly username=root
定义好的静态变量无法被修改也无法撤销,只能使用。
4.语法规则详解
-
变量名称可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写。
-
等号两侧不能有空格,衍生规则就是变量声明时必须初始化
-
在bash中,变量默认类型都是字符串类型,无法直接进行数值运算。
-
变量的值如果有空格,需要使用双引号或单引号括起来。
-
变量名区分大小写。
5.特殊变量
① $n
n是数字,$0代表当前脚本名称。从$1开始代表对应的脚本参数。从${10}开始数字需要使用{}括起来。
② $#
返回输入参数的个数
③ $*和$@
都能够返回全部参数,但是只有在循环中且放在引号中能够体现出它们的区别。
④ $?
返回上一条命令的执行结果。
-
条件判断语句
-
返回 0 表示 true
-
返回 1 表示 false
-
-
普通语句
-
返回 0 表示成功
-
返回非 0 数表示失败
-
二、Shell脚本中的几种逻辑语句
1. Shell中的运算符
Shell中运算符表达式的语法格式有两种:$((a+b))、$[a+b]
运算的过程需要在指定的格式内,且前面要加上$符号。
2.Shell中的条件判断
2.1基本语法
-
写法1:test condition
-
写法2:[ condition ]
-
注意 condition 前后有空格
-
空字符串视为 false,非空字符串视为 true
-
2.2 常用判断条件
数据类型 | 写法 | 单词 | 含义 |
---|---|---|---|
数值 | -lt | less than | 小于 |
数值 | -le | less equal | 小于等于 |
数值 | -eq | equal | 等于 |
数值 | -gt | greater than | 大于 |
数值 | -ge | greater equal | 大于等于 |
数值 | -ne | not equal | 不等于 |
文件 | -r | read | 判断当前用户是否可以读取该文件 |
文件 | -w | write | 判断当前用户是否可以修改该文件 |
文件 | -x | execute | 判断当前用户对该文件是否有执行权限 |
文件 | -f | file | 判断当前文件是否存在并且是一个常规的文件 |
文件 | -e | existence | 判断文件是否存在 |
文件 | -d | directory | 判断是否存在并且是一个目录 |
①判断条件语句是否成立:
②判断文件/目录的情况
3、Shell脚本的运行
3.1 三元运算
在三元运算中,条件的语法格式和shell脚本内的格式是相同的,通过两个&符将条件与三元输出值连接,且true和false之间通过 || 进行连接。
3.2if判断
①单if的情况:
在单if判断中,通过条件判断来决定要执行的代码,跟在then后的代码只有当条件为true时才会被执行。
②if……else的情况:
在if……else的语句中,当if中的条件不为true时,则会执行else中then后的语句
③if…elif...的情况:
当第一个条件不满足时,继续向下判断第二个条件,若都不满足,此时存在else的话执行else,不存在则不执行。
3.2.1 单if
if [ 10 -gt 5 ] then echo "10大于5" fi
3.2.2 if...else...
if [ 10 -gt 5 ] then echo "10大于5" else echo "10小于5" fi
3.2.3 if...elif...
if [ 10 -gt 5 ] then echo "10大于5" elif [ 10 -lt 5 ] then echo "10小于5" else echo "10等于5" fi
3.3 case判断
case判断与java中的swtich-case比较相似,只是语法不同,通过对指定变量的判断,决定要执行的代码。
AGE=10
case $AGE in
"10")
//若满足,执行下面的语句
echo 10
;;
"20")
//若满足,执行下面的语句
echo 20
;;
*)
echo other
//若都不满足,执行下面的语句
echo 30
;;
esac
3.4 for循环
注意:do关键字是for循环开始,done是for循环结束。
① 简单for循环:在shell脚本内部写死的循环条件
for (( i=1;i<=10;i++ )) do echo $i done
② 从外部传入循环长度:通过设置单个或多个参数,对for循环进行参数注入,获取循环结果
#!/bin/bash # 如果需要使用外部数据,则需要把外部数据赋值给一个变量,不能在for语句中直接使用 len=$1 for (( i=1;i<=len;i++ )) # 从do关键字开始是循环体开始 do echo $i; # 到done关键字为止是循环体结束 done
3.5 for in循环
for i in $* do echo $i done
没有引号的时候$*和$@一样,加了引号就有区别
for i in "$*" do echo $i done
上面代码输出的结果是:
"$*"会将所有元素当成一个值处理,所以不换行
"$@"将所有元素每一个都遍历一次进行处理,每输出一个元素都换行。
3.6 while 循环
在whlie循环中,通过条件判断在do循环体内执行相应的代码,进行相应的操作。
sum=0
start=1
while [ $start -le 100 ]
do
# 累加
sum=$[$sum+$start]
# start的值自增1
start=$[$start+1]
done
echo $sum