4.7 Shell脚本
一、什么是shell:
shell解释:引用别人的话说:“Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。”
简而言之,shell是命令解释器之外的一种编程语言。
shell可以做什么:批处理、自动化管理、监控管理、日志数据处理、自动数据备份等等。
二、组成部分和执行方式
1、shell脚本组成部分
1)注释:#开头
2)命令:shell基本语法
3)变量:shell支持字符串变量和整数变量。
4)结构控制语句:流程控制语句
2、执行方式
两种执行方式
1)sh shelltest
2)./shelltest
说明:两种执行方式的权限控制不一样。
三、语法说明
1、注释、指定执行方式、退出
- 注释等说明信息,要以#开头。
- 脚本的第一行调用时表明基于bash的方式执行:#!/bin/bash(说明:如果系统默认是bash执行,不写也行)
- 退出时最好写上:exit 0
示例:
#!/bin/bash
# 我是注释 :-e特殊字符(\a、\n)转义
echo -e "Hello World!\a\n"
exit 0
2、变量和变量的计算
定义变量:name=aa
说明:
- name:变量名,变量名用小写字母命名
- \=:赋值符号,两边绝对不能有空格
- aa:可以为字符串,可以为数值
引用变量:$name(表示引用name的值)
变量的数值计算:
语法:需要使用双层小括号括起来,模运算:% 幂运算:**
示例:实现a + b
#!/bin/bash
a=10
b=20
echo $(($a+$b))
echo $((100+20-20*2))
./shelltest执行,结果为:
30
80
字符串操作:
${#string} : 计算长度
${string:position} : 从position开始截取
${string:position:length} : 从position开始截取length长度
${string#substring} : 删除开始的字符串
示例:
${string#I*.} : 删除从I到.的所有字符(最短匹配)
${string##I*} : 删除开始I到.所有字符(最长匹配)
3、语句判断
1)判断语句test命令
可以使用:man test查看test的语法说明。
以下为test的几个基本使用:
-f:文件是否存在
-d:目录是否存在
-r:文件是否有读权限
-w:文件是否有写权限
-x:文件是否有执行权限
示例:
#!/bin/bash
filename=/home/zhangsan
test -f $filename && echo 'exist' || 'not exist'
通过./shelltest执行,会显示’not exist’
2)[]判断
注意:
1)中括号中必须用空格隔开
2)中括号中的变量最好以双引号括起来
3)中括号中的常数,最好以单引号括起来
eg:
[ "$a" == "$b" ]&&echo 'yes' || echo 'no'
[ '12' == '10' ]&&echo 'yes' || echo 'no'
4、条件分支
三种条件分支:单分支、双分支、多分支
1)单分支判断
语法:
if[];then
echo 'aa'
fi
示例:
#!/bin/bash
filename=/home/asdf
if[ test -f $filename ];then
echo 'aa'
fi
2)双分支判断
#!/bin/bash
if[];then
echo 'aa'
else
echo 'bb'
fi
3)多分支判断
多分支判断有两种方式:if elif else方式、case in方式。
第一种:if elif else方式
示例:
#!/bin/bash
if[];then
echo 'aa'
elif
echo 'bb'
elif
echo 'cc'
fi
第二种:case in方式
语法:
case $name in
1);;
echo 'aa'
esac
多分支示例:
从终端接收一个输入参数,然后进行条件判断。(read:接收用户输入)
#!/bin/bash
echo '输入一个值:'
read number
if[ $number == 1 ];then
echo '2'
elif[ $number == 2 ];then
echo '2'
else
echo '错误'
fi
示例,查看硬件信息脚本:
#!/bin/bash
echo '输入一个值:'
read hd
if[ $hd == cpu ];then
cat /proc/cpuinfo
elif[ $hd == mem ];then
cat /proc/meminfo
elif[ $hd == hard ];then
df -h
else
echo '错误'
fi
case in方式的示例:
#!/bin/bash
echo '输入一个值:'
read number
case $number in
1)
echo '1';;
2)
echo '2';;
*)
echo '错误';;
esac
5、循环语句
循环语句有三种方式:while do循环、until do循环、for循环
说明:[]中要使用以下转义符号;(())不需要转义。shell推荐使用[]。
[] : -eq -ne -gt -ge -lt -le
(()): == != > >= < <=
1)while do循环
说明:示例中[ $i -eq 5 ] 等价于 (($i==5))。
#!/bin/bash
i=10
while [ $i -eq 5 ];do
echo $i;
((i--));
done;
2)until do循环:直到..才执行
#!/bin/bash
i=10
until (($a<0));do
echo $i;
((i--));
done;
3)for循环
#!/bin/bash
for((i=1;i<=10;i++));do
echo $i
done;
6、函数(方法)
参考示例,文件名为shelltest:
#!/bin/bash
function print(){
echo '$1'
}
case $1 in
"one")
print 1;;
"two")
print 2;;
*)
print '错误';;
esac
执行的时候可以直接通过控制台直接传参:
$ ./shelltest one
以下执行结果为:2
$ ./shelltest two