shell脚本之知识点
1.运算指令
shell脚本中的变量都是字符串,如果要进行算术运算(5-3)的操作,需要使用算术运算指令实现
a.运算指令
(1). (())
书写格式与C语言差不多,格式不严格
运算表达式中变量存储的必须是整数形式的字符串,不然会报错,也就是a=4,而不是a='w'这种。
((a=1+2)) //a=$((1+2))
((c=$a+$b)) //c=$(($a+$b)),引用a+b的结果,但是(())中的变量引用可以不加符号,即等同于((c=a+b))
(2).let
let 变量=算术表达式 //中间不允许有空格
let a=1+2
let c=a+b //let c=$a+$b 右值当中可以不加$引用变量。
(3).$[]
$[] 自带一个引用,所以它的运行结果不能单独占用一行,必须要有变量接收或者echo打印。里面的表达式可以不加$,也可以有空格。
(4).expr
可以做算术运算,但格式严整,一般不用。
一般适合于字符串的运算
expr $字符串1 : $字符串2 //比较字符串和字符串2是否相同并显示到终端,不同为0,相同则返回相同字符的个数
expr match $字符串1 字符串2 //同上
expr substr $字符串 下标 长度 //从字符串的下标位置(从1开始)获取指定长度的字串
expr substr $str 2 3
expr index $字符串 字符 //从字符串中查找指定字符所在下标的最小位置,(下标从1开始),如果找不到则返回0
expr index "www.baidu.com" "baidu"
expr length $字符串 //获取字符串的长度
二、绝对路径与相对路径(Linux)
1.绝对路径
- 绝对路径是从文件系统的根目录(通常是/)开始的完整路径。
- 它提供了文件或目录的完整位置,不依赖于当前工作目录。
- 例如:/home/user/documents/file.txt是一个绝对路径,它指定了文件file.txt的完整路径,无论当前工作目录是什么都能准确找到它。
2.相对路径
- 相对路径描述了从当前工作目录到目标文件或目录的路径。
- 可以使用 . 表示当前目录,… 表示上级目录,以及其他相对路径来导航到目标位置。
- 在命令行中,可以通过在命令中使用相对路径来访问文件或目录,例如 ls documents。
- 在脚本或程序中,相对路径可能需要与程序的当前工作目录相结合,因此需要小心处理。
- 使用方法
- 使用相对路径访问文件或目录:
假设当前工作目录是 /home/user,目标文件是 /home/user/documents/file.txt。
使用相对路径 documents/file.txt 可以直接访问目标文件。
cd /home/user
cat documents/file.txt
- 使用 … 访问上级目录:
假设当前工作目录是 /home/user/documents,想要访问 /home/user/pictures/photo.jpg。
使用相对路径 …/pictures/photo.jpg 可以访问上级目录的子目录中的文件
cd /home/user/documents
cp ../pictures/photo.jpg .
- 使用 . 表示当前目录:
假设当前工作目录是 /home/user/documents,想要访问当前目录中的文件 document.txt。
使用相对路径 ./document.txt 可以直接访问当前目录中的文件。
cd /home/user/documents
cat ./document.txt
- 结合多个相对路径:
假设当前工作目录是 /home/user,想要访问 /var/log/messages。
可以结合多个相对路径来访问目标文件。
cd /home/user
cat ../../var/log/messages
三、分支循环语句
1.if
if [ 判断语句 ] //注意空格
then
语句块
fi
、、、、、、、、、、、、
if [ 判断语句 ]
then
语句块1
elif
then
语句块2
else
语句块3
fi
1.整数大小比较
判断语句格式
$变量 指令 $变量 //变量中必须是整数型字符串
指令
-gt 大于 greater than
-lt 小于 less than
-eq 等于 equal
-ge 大于等于
-le 小于等于
-ne 不等于
2.字符串的比较
非整型字符串比较
比较逻辑同C语言中的strcmp一致,从第一个字符开始依次往后比较,直到比较到不同,或两个字符串同时结束
变量中存储的字符串中可能有空格字符,因此在变量引用时加上" "最好
格式: $变量1 指令 $变量2
指令 | 含义 |
---|---|
\< | 小于 |
\> | 大于 |
==或= | 比较字符串是否相等 |
!= | 比较字符串是否不相等 |
格式:指令 $变量
指令 | 含义 |
---|---|
-z | 判断字符串是否为空,若为空,返回真 |
-n | 判断字符串是否为非空,若为非空,返回真 |
3.逻辑运算
格式 if [ 判断语句1 指令 判断语句2 ]
指令 | 含义 |
---|---|
-a | and(与) |
-o | or(或) |
!非 --------》 if [ ! 判断语句 ]
2.case-in分支
case $变量 in //$变量中的变量可以是常量也可以是变量,还以可以是算术表达式。就是变量中的内容和选项比较,注意一些特殊的符号,可能要加\这个转义符号
选项1)
语句块1
;; //" ;; "等价于break,所以不能忽略
选项2)
语句块2
;;
*)
语句块3 //*是通配符,表明上面选项都不符合时,默认执行语句块3
;;
esac //case -in结构的结尾
选项中的内容可以使用正则表达式,在多个选项之间有关系和规律时
符号 | 含义 |
---|---|
[] | 其中可以填字符集合,但是只匹配其中的任意单一字符 |
[1234567890] | 代表0-9中的任意一个字符 |
[0-9] | 同上 |
a-Z | 代表小写的a-z和大写的A-Z |
? | 可以通配任意单一字符 |
* | 可以通配任意0个或多个字符 |
| | 多个选项之间使用“|”连接 |
3. while循环结构
- shell脚本格式
while [ 判断条件 ]
do
循环语句
done
4.for循环结构
- shell脚本格式
for ((i=o;i<10;i++)) //C语言怎么写,括号内就怎么写
do
循环语句
done
——————————————————————————————
for ((;;)) //死循环格式
do
循环语句
done
————————————————————————————————
for 循环变量名 in 选项列表 //1将选项列表中的数据赋值依次给循环变量,然后进入循环执行循环语句
do
循环语句
done
——————————————————————————————————
选项列表
1. {1..100}//1到100的连续整数序列
2. seq 1 100 //获取1到100的所有整数打印到终端上
3. $(seq 1 2 100 ) //获取1到100的步长为2的整数序列
4.`seq 1 2 100` //同上
————————————————————————————————————
1.省略in和选项列表,列表默认从位置变量获取,从$1开始获取:$1 $2 $3....
5. select-in
格式
select 变量名 in 选项列表
do
循环语句
done
————————————————————————————————————
1.会生成选项列表界面,以便选择
2.ctrl+d可以结束select循环,继续往后执行
3.输入的选项不在选项列表中,会给变量赋值一个空
4.不输入直接回车,会将选项列表界面重写打印一遍
6. break和continue
1.break
1.break 跳出当前循环,只能向往跳出一层//与c基础一致
2.break n 向外跳出n层循环,若n大于循环嵌套的层数,会直接跳出最外层循环
2.continue
1.contiune 强制结束当前层循环,进入当前层循环的下一次循环
2.若n大于循环嵌套的层数,会直接结束最外层的当前次循环,进入最外层的下一次循环
七、shell脚本中的函数
1.定义格式
function 函数名() //定义函数时不需要写参数列表
{
函数功能实现代码
}
2.调用格式
- 直接写函数名即可如 show
- 函数定义必须放在函数调用之前,否则会不认识函数,因为shell脚本是从上往下运行的
3.传参方式
- 不传参,因为shell脚本中的变量默认都是全局的,所以不用传参,函数内部以及函数外部实际上可以访问同一个变量
- 如果想要变量为局部变量,可以在变量前加上local声明
loacl 变量
- 函数调用的时候传入参数即可
函数名 参数1 参数2 参数3
add $a $b $c - 函数的内部若想要获取到传入的参数,需要使用
$0:shell脚本名
$1 $2 $3
$@或者$* 获取所有参数,除了$0
$# 获取所有参数的个数,除了$0
4.返回值
- 若只写return后面没有填数据,或者根本没有写return,此时函数默认会返回最后一个指令的运行状态,成功返回0。
- 若return后面想要返回一个数据,这个数据只能是0-255范围内的一个数。一般默认,返回0代表函数运行成功,非0代表函数运行失败。
- 可以用$?接收函数返回值。