shell脚本编程
shell ---> 解析器:sh csh ksh bash
shell命令 ---> shell解析的命令
shell脚本 --> shell命令的有序集合
shell脚本编程:
将shell命令结合按照一定逻辑集合到一起,写到一个 .sh 文件,去实现一个或多个功能,这个脚本文件不用编译可以直接执行
解释型:脚本、python
编译型:c、c++、java、汇编语言
写一个shell脚本文件的步骤:
创建一个脚本文件
touch xxx.sh
编辑脚本内容
vi xxx.sh 或者 code xxx.sh
执行脚本文件
1)chmod 777 xxx.sh ./xxx.sh
2)bash 文件名
shell变量
shell中允许建立变量存储数据,但是不支持数据类型(如:整型、字符、浮点类型),所有赋值给变量的值都解释为一串字符。
变量的定义格式: 变量名=值(等号两边都不能有空格)
取变量的值:$变量名
变量的分类
系统环境变量
系统配置好的,内置的变量
env 或者 printenv:查看环境变量
临时修改:export 变量名=值
永久生效:只需要将这个命令放到家目录下的 .bashrc 中,当前用户有效
自定义变量
变量的格式
变量名=值
变量名='值'
变量名="值"
=两侧不能有空格
'' 内不能使用$展开变量的值
修饰变量的关键字:
unset:清空变量的值,不能清空readonly修饰的变量
readonly:只读变量,值不能修改
位置变量和命令行参数
$0 ---> 执行脚本名
$1 $2 $3 ... $9
${n} ---> n:大于等于10的数:如 ${10}
$# ---> 获取所有外部参数的个数(不包含脚本名)
$* 或者 $@ ---> 获取所有外部参数(不包含脚本名)
预定义变量
$? 获取的是上一条命令是否是正确的执行结果
0:为真 非0:为假
$$ 获取当前脚本的进程ID
shell中的语句
说明性语句
以 # 号开始到该行结束,不被解释执行
#!/bin/bash 告诉操作系统使用哪一种解析器执行的脚本文件
功能性语句
任意的shell命令、用户程序或其它shell程序
结构性语句
条件测试语句、多路分支语句、循环语句、循环控制语句
功能性语句
1.read(类似C语言中scanf)
从终端获取值赋值给变量
格式 read 变量1 变量2
加提示语句:read -p "提示语句" 变量1 变量2
补充:
read -s 变量 ---> 输入的信息不回显
read -t 秒数 变量 ---> 如果用户n秒不输入,就结束输入向后执行语句
read -n 个数 变量名 ---> 如果输入n个字符,自动停止
shell中的运算
shell本身不擅长运算,需要借助于运算符和其他的指令
2.1. expr
使用方法:
- expr中使用变量,必须加$
- 如果想要接收expr的结果,必须使用命令置换符
- expr中运算符两侧必须有空格 、不支持自增和shell中的幂运算
- expr中使用某些运算符是,需要转义 |、>、<...
- expr指令的结果,直接回显到终端上,可以使用命令置换符接收
2.2. let
使用方法:
- let 变量名=表达式
- let运算时,运算符两侧不能有空格
- let中使用变量时,可以加$也可以不加
- 如果直接写成 let 表达式,表达式会运行,但是没有办法接收
3.test
test语句可以测试三种对象
字符串 整数 文件属性
3.1. 字符串测试
s1 = s2 测试两个字符串是否相等
s1 != s2 测试两个字符串是否不相等
-z s1 测试字符串是否为空
-n s1 测试字符串是否不为空
3.2. 整数测试
a -eq b 测试a和b相等 equal
a -ne b 测试a和b不相等 not equal
a -gt b 测试a大于b greater than
a -ge b 测试a大于等于b greater equal than
a -lt b 测试a小于b less than
a -le b 测试a小于等于b less equal than
3.3. 文件属性测试
-d file 测试file是否为一个目录
-f file 测试file是否是一个普通文件
-e file 测试file是否存在
结构性语句
if .. then .. fi
基本结构
if 表达式
then命令表
fi
分层结构
if 表达式
then命令表1
else命令表2
fi
嵌套结构
if 表达式
thenif 表达式then
命令表else
命令表fi
else
命令表
fi
elif
if 表达式1
then命令表1
elif 表达式2
then命令表2
...
else命令表n
fi
注意:
如果表达式为真, 则执行命令表中的命令; 否则退出if语句,
即执行fi后面的语句。
if和fi是条件语句的语句括号, 必须成对使用;
命令表中的命令可以是一条, 也可以是若干条。
补充操作符:
-o 或运算 例如 [ $a -lt 20 -o $b -gt 100 ] 返回 true
-a 与运算 例如 [ $a -lt 20 -a $b -gt 100 ] 返回 false
! 非运算 例如 [ ! false ] 返回 true
&& 逻辑与 例如 [[ $a -lt 100 && $b -gt 100 ]] 返回 false
|| 逻辑或 例如 [[ $a -lt 100 || $b -gt 100 ]] 返回 true
| 位或 例如 echo $[2|2]
&位与 例如 echo $[2&1]
case语句
工作方式:
取值后面必须为关键字 in ,每一个模式必须以右括号结束。
取值可以为变量或者常量,取值检测匹配的每一个模式 一旦模式匹配,其间所有命令开始执行直至 ;;
执行完匹配模式相应的命令不会再继续匹配其他的模式
如果无一匹配模式,使用 * 号捕获该值
for循环
for语句的几种书写格式
1.for i in 1 2 3 4 5 do .. done:变量i从单词表中取
for i in 1 2 3 4 5
do语句块
done
2.for i do .. done:变量i从命令行中取值,可以省略in 单词表
for in
do语句块
done
3.for i in {1..10} do .. done
for i in {1..10}
do语句块
done
4.for (( i = 1; i <= 10; i++ )) do .. done
for ((i=1;i<10; i++))
do语句块
done
while循环
while 命令或表达式
do命令表
done
循环控制语句
break n :结束n层循环
continue n :跳过n层的本次循环