一、简单介绍
1.1 什么是Shell
GUI 提供了一种图形化的用户接口,使用起来非常简便易学;而 Shell 则为用户提供了一种命令行的接口,接收用户的键盘输入,并分析和执行输入字符串中的命令,然后给用户返回执行结果,使用起来可能会复杂一些,但是由于占用的资源少,而且在操作熟练以后可能会提高工作效率,而且具有批处理的功能,因此在某些应用场合还非常流行。
Shell 作为一种用户接口,它实际上是一个能够解释和分析用户键盘输入,执行输入中的命令,然后返回结果的一个解释程序
二、变量运算
2.1 declare命令
2.1.1 声明变量类型
root@tedu:~# declare[+/-][选项]变量名
选项:
- : 给变量设定类型属性
+ : 取消变量的类型属性
-a : 将变量声明为数组类型
-i : 将变量声明为整数型(intenger) # 重点掌握,其他了解
-x : 将变量声明为环境变量
-r : 将变量声明为只读变量
-p : 显示指定变量的被声明的类型
2.1.2 把变量声明为数值型
示例:
root@tedu:~# aa=11
root@tedu:~# bb=22
root@tedu:~# cc=$aa+$bb
root@tedu:~# echo $cc
11+22 # 默认是字符串型,是字符串的拼接
root@tedu:~# declare -i cc=$aa+$bb #-i 声明cc是整形
root@tedu:~# echo $cc
33
root@tedu:~# declare -p cc # 查看变量的被声明的类型
declare -i cc="33"
2.1.3 声明数组变量
- 定义数组
root@tedu:~# movie[0]=zp
root@tedu:~# movie[1]=tp
root@tedu:~# declare -a movie[2]=live
- 查看数组
root@tedu:~# echo ${movie} #zp
root@tedu:~# echo ${movie[2]} # live
root@tedu:~# echo ${movie[*]} #zp tp live
# 下标号代表索引 * 代表所有数值
2.1.4 声明环境变量
declare -x test=123
#和export作用相似,但其实是declare命令的作用
root@tedu:~# aa=11
root@tedu:~# bb=22
root@tedu:~# export bb
root@tedu:~# set aa bb
2.1.5 声明变量只读属性
root@tedu:~# declare -r test
#给test赋予只读属性,但是请注意只读属性会让变量不能修改不能删除,甚至不能取消只读属性
root@tedu:~# declare -p test #declare -x test="123"
root@tedu:~# declare -r test
root@tedu:~# declare -p test #declare -rx test="123"
root@tedu:~# test=456 # -bash: test: readonly variable 只读属性,无法修改
root@tedu:~# unset test
# -bash: unset: test: cannot unset: readonly varable 变量只读,无法删除
-r 只要生成,就无法更改,删除,无法还原
2.1.6 查询变量的属性
declare -p
#查询所有变量的属性
declare -p变量名
#查询指定变量的属性
2.2 数值运算的方法
2.2.1 数值运算方法1
root@tedu:~# aa=11
root@tedu:~# bb=22
#给变量aa 和 bb赋值
root@tedu:~# declare -i cc=$aa + $bb
2.2.2 数值运算方法2 expr或let数值运算工具
root@tedu:~# aa=11
root@tedu:~# bb=22
#给变量aa和变量bb赋值
root@tedu:~# dd=$(expr $aa + $bb)
#dd的值是aa和bb的和. 注意 "+"号左右两侧必须有空格
root@tedu:~# echo
2.2.3.“ ( ( 运 算 式 ) ) " 或 " ((运算式))" 或 " ((运算式))"或"[运算式]”
root@tedu:~# aa=11
root@tedu:~# bb=22
root@tedu:~# ff=$(($aa+$bb))
root@tedu:~# gg=$[$aa+$bb]
2.3 运算符的优先级
root@tedu:~# aa=$(((11+3)*3/2))
# 虽然乘和除的优先级高于加,但是通过小括号可以调整运算优先级
root@tedu:~# bb=$((14%3))
#14不能被3整除,余数是2
root@tedu:~# cc=$((1&&0))
#逻辑与运算只有想与的两边都是1,与的结果才是1,否则与的结果是0
2.4 变量测试(只针对shell语言)
优点: 语法简单,执行效率高
缺点: 逻辑混乱
变量测试在做脚本测试时使用
示例: x=${
y-新值} x=新值 x为空 x=$y
例子1:测试x=${
y-新值}
root@tedu:~# unset y
#删除变量y
root@tedu:~# x=${y-2}
#进行测试
root@tedu:~# echo $x
2
#因为变量y不存在,所以x=new
例子2:
root@tedu:~# y=""
#给变量y赋值为空
root@tedu:~# x=${y-2}
#进行测试
root@tedu:~# echo $x
输出为 空
三、正则表达式
3.1 正则表达式
它是用于字符串的模式分割,匹配,查找及替换操作
3.2 正则表达式与通配符
- 正则表达式用来在文件中匹配符合条件的字符串,正则是包含匹配.grep,awk,sed等命令可以支持正则表达式
- 通配符用来匹配符合条件的文件名,通配符是完全匹配.ls,find,cp这些命令不支持正则表达式,所以只能使用shell自己的通配符来进行匹配了.
3.3 基础正则表达式
见附图: 基础正则
四、流程控制语句
4.1 条件判断式
4.1.1 按照文件类型进行判断
-
两种判断格式
-
test -e/root/install.log (不常用)
-
[-e/root/install.log] (常用)
-
示例:
[-e /root/install.log]
echo $?
0(True)
[-d /root] && echo "yes" || echo "no"
#第一个判断命令如果正确执行,则打印"yes",否则打印"no"
root@tedu:~# 输入:[-e /root/install.log] && ceho yes || echo no
root@tedu:~# 输出: yes
4.1.2 按照文件权限进行判断
[-w student.text]&& echo "yes" || echo "no"
#判断文件是否拥有写权限的
root@tedu:~# 输入:[-w /root/install.log] && ceho yes || echo no
root@tedu:~# 输出: yes
4.1.3 两个文件之间进行比较
判断两个文件节点是否一致
4.1.4 两个整数之间比较
# 判断23是否大于等于22,yes
[23 -ge 22] && echo yes || echo no
yes
#判断23是否小于等于22,no
[23 -le 22] && echo yes || echo no
no
4.1.5 字符串的判断
示例:
name =fengj
#给name变量赋值
[-z $name]&&echo yes || echo no
no
#判断name 变量是否为空,因为不为空,所以返回no
aa = 11
bb = 22
#给变量aa和变量bb赋值
["$aa" == "bb"$echo yes || echo no
no
#判断两个变量的值是否相等,明显不相等,所以返回no
用的是== 判断的是字符串
4.1.6 多重条件判断
aa=11
[-n "$aa" -a "$aa" -gt23] $$echo yes || echo no
no
#判断变量aa 是否有值,同时判断变量aa的值是否大于23
#因为变量aa的值不大于23,所以虽然第一判断值为真,返回的结果也是假
五、if语句
学习小脚本示例的好处
- 掌握语法结构
- 了解shell的作用
如何 “背” 程序?
- 抄写老师的程序并能正确运用
- 为程序补全注释
- 删掉注释,为代码重新加注释
- 看注释写代码
- 删除代码和注释,从头开始写
5.1 单分支if条件语句
- 语法:
if [条件判断式];then
程序
fi
或:
if [条件判断式]
then
程序
fi
- 注意事项
- if语句使用fi结尾,和一般语言使用大括号结尾不同
- [条件判断式]就是使用test命令判断,所以中括号和条件判断式之间必须有空格
- then后面跟符合条件之后执行的程序,可以放在[]之后,用";“分割.也可以换行写入,就不需要”;"了
- 示例:
1.判断登录的用户是否root
test=$(env|grep "USER" | cut-d "=" -f2)
if["$test" == root]
then
echo "Current user is root."
fi
实现步骤:
1.在超级用户模式下输入
#匹配行
root@tedu:~# env | grep USER=r
#USER=root
#匹配列
root@tedu:~# env | grep USER=r | cut -d "=" -f 2
# root
2.创建if1.sh文件
root@tedu:~# vim if1.sh
#查看穿件的文件
root@tedu:~# ll
#文件查看需要赋于权限
root@tedu:~# chmod 755 if1.sh
#运行程序
test=$(env | grep USER=r | cut -d "=" -f 2)
echo test
root@tedu:~# ./if1.sh
root
3.进入if1.sh文件
root@tedu:~# vim if1.sh
4.编写if1文件
test=$(env | grep USER=r | cut -d "=" -f 2)
if [ "$test" == "root" ]
then
echo "dangqian yonghu shi root"
fi
5.执行if1文件
root@tedu:~# ./if1.sh
6.执行结果
dangqian yonghu shi root
5.2 双分支if语句
- 语法:
if [ 条件表达式 ]
then
条件成立时,执行的程序
else
条件不成立时,执行的另一个程序
fi
- 示例1:
1.创建if1.sh文件
root@tedu:~# vim if2.sh
2.进入if1.sh文件
root@tedu:~# vim if2.sh
3.编写if2程序
read -t 30 -p "please input a dir:" dir
if [ -d "$dir" ]
then
echo "shuru de shi mulu"
else
echo "no no no"
fi
4.退出if2.sh文件
esc -- :wq
5.执行if2.sh文件
root@tedu:~# ./if2.sh
please input a dir:
please input a dir:/root
shuru de shi mulu
- 示例2 if3.sh
#判断apache 是否启动
test = $(ps aux | grep | heepd | grep -v grep)
if [ -n "$test" ]
then
echo "httpd is ok"
else
echo "httpd is no"
/etc.rc.d/init/httpd start
fi
5.3 多分支if语句
- 语法
if [ 条件表达式1 ]
then
当条件条件判断式1成立时,执行程序1
elif [ 条件表达式2 ]
then
当条件条件判断式2成立时,执行程序2
.......
else
当所有条件都不成立,最后执行此程序
fi
5.4 case 语句
- 语法:
case $变量名in
"值1")
如果变量的值等于值1,则执行程序1
;;
"值2")
如果变量的值等于值2,则执行程序2
;;
...省略其他分支
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac
六、for&while&until语句
6.1 for 循环
- 语法
for 变量 in 值1 值2 值3...
do
程序
done
- 示例:
for i in 1 2 3 4 5
do
echo $i
done
6.2 while循环和until循环
- 语法
while [ 条件判断式 ]
do
程序
done
- 示例:
#从1加到100
i = 1
s = 0
while [ $i -le 100 ]
#如果变量i的值小于等于100,则执行循环
do
s=$(($s+$i))
i=$(($i+ 1))
done
echo $s
6.3 until 循环
和while 循环相反,until循环是只要条件判断不成立则进行循环,并执行循环程序.一旦循环条件成立.则终止循环
i=1
s=0
until [$i -gt 100 ]
do
s=$(( $s+$i))
i=$(($i+1))
done
echo $s
附图