Shell脚本学习入门
最近学习了Shell脚本,对所学部分内容进行归纳整理下。Shell脚本学习的目的在于熟悉Linux命令,同时利用Shell脚本进行自动化部署测试环境。
Shell简介
Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。
Shell 既是一种命令语言,又是一种程序设计语言。它类似于DOS下的command.com和后来的cmd.exe。它接收用户命令,然后调用相应的应用程序。
Shell脚本
Shell 脚本(shell script),是一种为 shell 编写的脚本程序,弱类型语言,在定义变量不需要指定变量的类型。
通说所说的 shell 都是指 shell 脚本,我们要知道,shell 和 shell script 是两个不同的概念。
Shell环境
引用https://www.runoob.com/linux/linux-shell.html
Shell 编程跟 JavaScript、php 编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。
Linux 的 Shell 种类众多,常见的有:
Bourne Shell(/usr/bin/sh或/bin/sh)
Bourne Again Shell(/bin/bash)
C Shell(/usr/bin/csh)
K Shell(/usr/bin/ksh)
Shell for Root(/sbin/sh)
……
我学习的是 Bash,也就是 Bourne Again Shell,由于易用和免费,Bash 在日常工作中被广泛使用。同时,Bash 也是大多数Linux 系统默认的 Shell。
在一般情况下,人们并不区分 Bourne Shell 和 Bourne Again Shell,所以,像 #!/bin/sh,它同样也可以改为 #!/bin/bash。
#! 告诉系统其后路径所指定的程序即是解释此脚本文件的 Shell 程序。
Shell脚本规范
- 是以.sh结尾的文件
- 第一行内容为#!/bin/bash
- shell中的注释:#
第一个Shell脚本
在Linux中新建一个名为tesh.sh的文件,并输入下面的命令。
vim test.sh
#!/bin/bash
echo 'hello world!'
Shell脚本的运行
Shell脚本运行有两种方式:
- 作为可执行程序
将上面的代码保存为 test.sh,并 cd 到相应目录:
1)添加x权限:chmod +x 文件名.sh
2)执行 ./文件名.sh
chmod +x test.sh #使脚本具有执行权限
./test.sh #执行脚本
- 作为解释器参数
这种运行方式是,直接运行解释器,其参数就是 shell 脚本的文件名,即 sh 文件名.sh(或/bin/sh 文件名.sh)
/bin/sh test.sh
#可也使用 sh test.sh
两种方式分别执行后结果为:
Shell语法
变量
变量的定义
变量名=变量值
注意:等于号两边没有空格
命名规范:不能以数字开头,由字母、数字、下划线组成。
变量的输入输出
- 输入
read 变量名
read -p “提示信息” 变量名
read -p "请输入您的名字:" name
- 输出
echo $变量名
name=xiaoming
echo $name
变量的释放
释放变量的值,可通过unset 变量名:
变量释放后,不能再输出的值。
特殊的变量
当变量带有空格时,可以使用引号将变量引起来:
- 双引号""
如果变量值中存在$变量名的话,那么输出结果将会是变量名对应的变量值。
如果想原样输出内容,可以在$变量名前面加转义字符\ - 单引号:’’
如果变量值中存在$变量名,那么将原样输出。 - 反单引号``
存放的是命令。
传递参数
向.sh文件中传递参数
格式:命令 文件名 参数
如:sh script4.sh /etc
而脚本内获取参数的格式为:$n。n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推……
其中有几个特殊的形式:
$0:代表文件名
$@:显示全部参数
$#:显示参数的个数
创建一个名为script5.sh的文件,并输入如下命令:
#!/bin/bash
echo "这个数据是$1"
echo "这个数据是$2"
echo "这是$0"
echo "这是$@"
echo "这是$#"
保存后,向文件中传递参数,如下:
sh script5.sh /etc /nihao
执行结果为:
分支结构
if…else分支
语法格式:
if [ 条件 ]
then
语句
else
语句
fi
或
if [ 条件 ];then
语句
else
语句
fi
注意:
- 条件两边要有空格
- 多个条件间要有空格
- if后面要有空格
- 条件中如果存在变量,那么变量的两边要有双引号
练习:通过用户输入任意目录判断是否为空。
创建并编辑script6.sh
#!/bin/bash
#键盘录入任意目录
read -p "请输入目录:" dir
#dir=`ls /root`
d=`ls $dir`
if [ "$d" == "" ];then
echo "目录为空"
else
echo "目录不为空"
fi
补充知识点:
字符串的比较:==判断是否相等,!=判断是否不相等
if…elif…else分支
语法格式:
if [ 条件 ]
then
语句
elif [ 条件 ]
then
语句
elif [ 条件 ]
then
语句
…
else
语句
fi
注意事项与if…else分支相同。
case分支
语法格式:
case $变量名 in
“值”)
语句;;
“值”)
语句;;
“值”)
语句;;
…
*)
语句;;
esac
注意:
- case这一行最后必须为in
- ;;---->结束语句
- *---->默认
- esac—>case语句的结束
- 值可以是字符串也可以是数字
- “值”还可以是区间范围,范围[0-9]
练习:输入一个字母,判断该用户选择哪款产品,A:笔记本 B:电饭煲 C:小台灯
创建并编辑script13.sh
#!/bin/bash
read -p "请输入ABC用来选择产品:" wd
case $wd in
"A")
echo "您选择了笔记本";;
"B")
echo "您选择了电饭煲";;
"C")
echo "您选择了小台灯";;
*)
echo "没有对应产品";;
esac
运行结果:
循环结构
for循环
语法格式:
for 变量名 in 列表
do
语句
done
补充知识点:
seq start size max
- start:开始点
- size:间隔
- max:结束点
注意:如果size的值为1,则可以省略
练习:输出1-10之间的数
创建并编辑script16.sh
#!/bin/bash
for i in `seq 1 1 10`
do
echo $i
done
运行结果:
while循环
while [ 条件 ]
do
命令
done
练习:求1-100之间的和
创建并编辑script1.sh
#!/bin/bash
i=1
sum=0
while [ "$i" -le 100 ]
do
sum=$[$sum+$i]
((i++))
done
echo $sum
运行结果:
输入输出重定向
输入重定向
<覆盖,<<追加
输出重定向
>覆盖,>>追加
test命令
测试文件的状态:test 参数 变量名
参数:
-e表示文件是否存在
-f 表示文件是否存在且为文件
-d 表示文件名是否存在且为目录
-r 可读
-w 可写
-x 可执行
文件判断
-r -r filename 文件是否存在且可读
-w -w filename 文件是否存在且可写
-x -x filename 文件是否存在且可执行
-f -f filename 文件是否存在且是普通文件
-d -d filename 文件是否存在且是一个目录
-e -e filename 文件是否存在
-n -n str1 字符串长度是否不等于0
-z -z str2 字符串长度是否等于0
逻辑运算符
且: -a
或者: -o
非: !
比较运算符
-eq ---》判断是否相等
-ne--->判断是否不相等
-gt---->判断是否大于
-ge --->判断是否大于等于
-lt ----->判断是否小于
-le ---->判断是否小于等于
数字变量操作
((i++))
((i+=1))
i=
[
[
[i+1]
let i=i+1
i=
(
(
((
((i+1))
变量间加减运算
s=
(
(
((
((s+
i
)
)
s
=
i)) s=
i))s=[
s
+
s+
s+i]
((s=
s
+
s+
s+i))
函数
定义格式:
函数名(){
代码
}
函数需要先定义再调用,调用格式:函数名
参数:$n
返回值:函数中默认的存在返回值
正确时返回0
错误时返回1
查看返回值内容 : $?