Shell编程

Shell基础

什么是shell?

shell是用户和操作系统内核交互的接口,可以使用shell编写脚本来自动执行一系列命令和操作。


shell执行方式

分类

1、在当前shell环境运行

​ 1):./脚本

​ 2):soucre 脚本

2、开启子shell环境运行

​ 1):bash 脚本

​ 2):sh 脚本

两者区别

1、子shell会开启新线程,当前shell不会

2、当前shell修改变量是永久性的,子shell则仅子shell内有效

3、当前shell运行速度快,子shell因为要创建子线程运行比前者慢

shell快速入门

1
2
3
#!/bin/bash

echo 'hello-shell'

shell变量

什么是变量?

变量是内存中的一小块存储空间,存储自己指定的值,然后给这小块空间取个名字,当我们要用到值的时候通过变量的名字就能拿到对应的值。

shell变量分类

系统变量:系统本身定义好的,可以直接用

自定义变量:需要用户自己来定义

环境变量:应用运行时需要环境变量,我们不能每次都进入指定目录下运行,太过繁琐,只需要在/etc/profile下指定该应用的环境变量,这样在哪里都可以使用该应用了,例如JDK

预定义变量:获取命令行信息

shell变量的基本语法

1
2
3
4
5
6
7
8
9
10
#定义变量
变量名=值

#撤销变量
unset 变量名

#静态变量,值不可变,不能撤销
readonly 变量名=值

#``和$()可以将命令的返回值赋值给变量

练习

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash

name='Tom'
age=1001

unset age

readonly sex='女'

time=`date`

data=$(date)

echo "$name-----------$age---------$sex-------------$time---------$data"

环境变量

1
2
3
4
5
6
7
8
9
10
vim /etc/profile

#定义
exprot 变量名=值

#修改立即生效
source /etc/profile

#查看
echo $变量名

位置变量

$0:代表命令本身

$1-9:代表一到九的参数

${9以上的数字}:代表十或十以上的参数

$*:代表所有参数,看作一个整体

$@:代表所有参数,分别看待每一个参数

$#:代表参数的总个数

$?:返回上一次命令执行结果,0成功,非0失败

$$:表示当前shell的PID

$!:上一个后台进程的PID

$_:获取上次命令最后一个参数

1
2
3
4
5
6
7
8
9
#!/bin/bash

echo "名字=======$1 || 年龄========$2"

echo "测试\$*========$*"

echo "测试\$@========$@"

echo "测试\$#=========$#"

shell运算式

shell中有三种运算格式

1
2
3
4
5
6
7
8
#第一种
$((运算式))

#第二种,推荐使用
$[运算式]

#第三种,它的乘号用 \*,想得到它的值需要用 `` 符号括起来
变量名=`expr 值1 运算符 值2`

shell流程控制

if语句

判断给出的运算式执行相应操作

if语句基本格式

1
2
3
4
if [ 条件判断式 ]
then
操作
fi

常用判断比较符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
比较字符串用:=

#整数类比较
-lt:小于
-le:小于等于
-eq:等于
-gt:大于
-ge:大于等于
-ne:不等于

#权限类判断
-r:是否可读
-w:是否可写
-x:是否可执行

#文件类型判断
-f:判断文件是否存在且是一个常规文件
-e:判断文件是否存在
-d:判断文件是否存在且是目录


#逻辑运算符
&&:并且,左右结果必须都为真
||:或者,左右任意一个结果为真即可
!:取反

练习

1
2
3
4
5
6
7
8
#!/bin/bash

number=100

if [ $number -lt 200 ]
then
echo "$number小于200"
fi

if多分支语法格式

1
2
3
4
5
6
if [ 运算判断式 ]
then
业务代码
elif [ 运算判断式 ]
业务代码
fi

练习

1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash

number=100

if [ $number -gt 200 ]
then
echo "$number大于200"
elif [ $number -gt 50 ]
then
echo "$number大于50"
fi

case语句

语法格式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
case $变量 in
"值1")
业务代码1
;;
"值2")
业务代码2
;;
"值3")
业务代码3
;;
*)
默认业务代码
;;
esac

练习

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/bash

data=80

case $data in
"90")
echo "90分"
;;
"80")
echo "80分"
;;
*)
echo "没有对应分数"
;;
esac

for循环

第一种语法格式

1
2
3
4
5
#在列表值内都可循环
for 初始变量 in "值列表"
do
业务代码
done

第二种语法格式

1
2
3
4
for((初始变量;条件表达式;变量变化))
do
业务代码
done

第一种练习

1
2
3
4
5
6
7
8
9
10
#!/bin/bash

sum=0

for i in {1..100}
do
sum=$[$sum+$i]
done

echo "1加到100等于======$sum"

第二种练习

1
2
3
4
5
6
7
8
9
10
#!/bin/bash

sum=0

for ((k=0;k<=100;k++))
do
sum=$[$sum+$k]
done

echo $sum

while循环

语法格式

1
2
3
4
5
# [ ] 左右都有空格
while [ 条件表达式 ]
do
业务代码
done

练习

1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash

sum=0
j=0

while [ j<100 ]
do
sum=$[$sum+$j]
$j++;
done

echo $sum

键盘录入

在shell中使用read命令来获取用户输入的信息。

语法格式

1
2
3
4
5
read 选项 参数

#常用选项
-p:提示信息
-t:等待时间(秒)

练习

1
2
3
4
5
6
7
8
9
#!/bin/bash


read -t 10 -p '请输入用户名:' name

read -t 10 -p '请输入年龄:' age


echo "输入信息:用户===$name;年龄===$age"

数组

什么是数组?

数组是一种存储多个值的数据结构,可以按索引访问。

数组分类

普通数组:索引是数字,有序

关联数值:索引是单词,以key-value形式存储,类似Map形势,无序,索引不能重复,值可以

普通数组

1
2
3
4
5
6
7
8
9
10
11
#定义
数组名=(值1 值2 值3 ...)

#访问数组全部数据
${数组名[*]}

#根据指定索引访问对应数据
${数组名[索引]}

#获取数组长度
${#数组名[*]}

关联数组

1
2
3
4
5
6
7
8
#定义,先创建,再放值
declare -A 数组名
数组名=([索引1]=值1 [索引2]=值2 [索引3]=值3 ...)

#访问和普通数组一样
${数组名[索引]}
${数组名[*]}
${#数组名[*]}

循环操作数组

插入数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#普通数组使用while循环插入数据
#!/bin/bash

#将/etc/profile里的内容循环写入数组中
while read line
do
arr[++i]=$line
done < /etc/profile

echo ${#arr[@]}

#遍历
for((k=0;k<${#arr[@]};k++))
do
echo ${arr[k]}
done





#关联数组使用while循环插入数据
#!/bin/bash

#将/etc/profile里的内容循环写入数组中

declare -A arr
i=0
while read line
do
arr["index_$i"]=$line
((i++))
done < /etc/profile

echo ${#arr[@]}

#遍历
for((k=0;k<${#arr[@]};k++))
do
echo "${arr["index_$k"]}"
done

函数

什么是函数?

在shell中函数是一组可以重复使用的命令集合,可以接收参数并返回状态或值。

语法格式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#第一种
function 函数名 {
业务代码
}

#第二种,推荐使用
函数名() {
业务代码
}

#调用
函数名

#带参调用,定义了几个参数就写几个值
函数名 值 ...

练习

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#不带参
showTest() {
ls /yzg/shell >> yzg.java
}

showTest

#带参
#!/bin/bash

sum=0

showTest() {
sum=$[$1+$2]
}

showTest $1 $2

#获取状态码
if [ $? -eq 0 ]
then
echo "执行成功!==========状态码:$?============相加结果:$sum"
fi