一、了解什么是shell脚本
shell脚本的本质就是 shell命令的有序集合 ,它属于一种解释型语言,不需要编译,方便操作者对重复性的劳动进行编程,同时shell脚本也是一种无类型语言,其变量没有类型或字符串类型
注意事项: 对标点符号 和 格式 非常严格 特别是空格
二、创建一个shell脚本的步骤
1. 创建一个普通文件,通常后缀.sh
touch hello.sh
2. 修改权限 添加可执行权限
chmod 777 hello.sh
3. 写脚本
vim hello.sh
注:任何一个脚本文件的第一行都必须写: #!/bin/bash
4. 运行脚本 ./hello.sh
eg:写一个创建脚本的 创建1.sh
#!/bin/bash
#创建名为1.sh的脚本文件
touch 1.sh
#修改权限
chmod 777 1.sh
#在终端打印hello world
echo "hello world"
三、shell脚本中的变量
变量: 多用于代指文件名,即各种名字或参数命令等
1、用户自定义变量:
变量定义 变量名=值 等号两边 没有空格
变量使用 引用其值 $变量名 本质是字符替换
2、位置变量:
$0 运行脚本的指令本身
$1,$2,……$9 分别包含第一个到第九个命令行参数
3、预定义变量: 有终端预先定义的一些变量
由系统保留和维护的一组特殊的变量,这些变量通常用于保存程序运行状态等
$# 包含命令行参数的个数
$@ 包含所有命令行参数:“$1,$2,……$9”
$? 包含前一个命令的退出状态
$* 包含所有命令行参数:“$1,$2,……$9”
$$ 包含正在执行进程的ID号
4、环境变量: 一组存储终端环境参数的变量
注:export 命令可以打印输出 终端所有的环境变量
PWD 存储当前工作路径
USER 存储当前终端的登录用户
HOME 存储当前用户的家目录
PATH 存储当前终端 的命令搜索路径
eg:编写一个脚本文件来创建一个新的脚本
#!/bin/bash
#定义一个变量
#NAME=if.sh
#定义位置变量
NAME=$1
echo 正在创建$NAME文件
touch $NAME
echo 正在配置文件
chmod 777 $NAME
echo 正在写入第一行
echo "#!/bin/bash" > $NAME
echo $NAME文件创建成功!
结果展示:
四、shell脚本的 输入输出
输入:echo 输出字符串
输出:read 从终端读取字符串
五、shell中 的算数运算
expr 数学表达式
注:1、 每个符号与数值 间都要有空格分开
2、shell脚本支持 + - \* / % 但只能做整数运算不能做小数运算
六、shell 表达式
1、字符串测试
s1 == s2 测试两个字符串的内容是否完全一样
s1 != s2 测试两个字符串的内容是否有差异
-z s1 测试s1 字符串的长度是否为0
-n s1 测试s1 字符串的长度是否不为0
2、整数测试
a -eq b 测试a 与b 是否相等
a -ne b 测试a 与b 是否不相等
a -gt b 测试a 是否大于b
a -ge b 测试a 是否大于等于b
a -lt b 测试a 是否小于b
a -le b 测试a 是否小于等于b
-d name 测试name 是否为一个目录
-e name 测试一个文件是否存在
-f name 测试name 是否为普通文件
-L name 测试name 是否为符号链接
-r name 测试name 文件是否存在且为可读
-w name 测试name 文件是否存在且为可写
-x name 测试name 文件是否存在且为可执行
-s name 测试name 文件是否存在且其长度不为0
f1 -nt f2 测试文件f1 是否比文件f2 更新
f1 -ot f2 测试文件f1 是否比文件f2 更旧
七、shell中的程序结构
1、 if 结构
if [ 表达式 ]
then
命令块1
else
命令块2
fi
注:如果没有else 可以省略 ,则if结构可写为:
if [ 表达式 ]
then
命令块1
fi
eg:输入一个文件名,判断该文件是否存在, 若存在则判断是否为普通文件且是空的,若是则删除它
#!/bin/bash
#echo "请输入一个文件名"
#read FILE
FILE=$1
if [ -z $FILE ]
then
echo "UseAge:该脚本用于删除一个空的普通文件"
echo "需要指定一个文件名参数"
else
echo "正在操作$FILE"
if [ -e $FILE ]
then
echo "文件存在"
if [ -f $FILE ]
then
echo "是普通文件"
if [ -s $FILE ]
then
echo "文件有内容"
else
echo "文件没有内容, 删除$FILE"
rm $FILE
fi
fi
fi
fi
结果展示:
2、case 多分支结构
case $变量名 in
值1) 命令块1
;;
值2) 命令块2
;;
...
*) 命令块n
esac
运行逻辑 :将变量中字符串与括号左边的字符串比较相等就执行后面的命令块,若不相等 ,继续向后比较
注:值可以使用通配符
eg:输入成绩,判断输入的成绩的优良中差并输出
#!/bin/bash
echo "请输入你的成绩:"
read cj
case $cj in
100) echo "满分优秀!"
;;
9?) echo "成绩优秀"
;;
8?) echo "成绩良好"
;;
[67]?) echo "成绩及格"
;;
*) echo "成绩不及格"
esac
结果展示:
3、for循环
结构1:
for (( I=0;I<10;I++ ))
do
循环命令块
done
eg: 创建10个文件 文件名为 file_数.txt
#!/bin/bash
for ((I=0;I<10;I++))
do
touch file_$I.txt
done
结果展示:
结构2:
for 变量名 in 取值列表
do
循环命令块
done
注:取值列表中是以空格、回车等分隔开的字符串,每次循环变量的值就是取值列表中的一个 ,并且是顺序的
eg: 打印输出当前目录中 所有.sh 文件都打印出来
#!/bin/bash
#file=$1
for file in `ls *.sh`
do
echo " $file "
done
结果展示:
eg: 写一个脚本,实现将当前目录中所有的、空的、普通文件删除
#!/bin/bash
for file in `ls *`
do
echo " $file "
if [ -e $file ]
then
echo "文件存在"
if [ -f $file ]
then
echo "普通文件"
if [ -s $file ]
then
echo "有内容"
else
echo "没有内容,删除$file"
rm $file
fi
fi
fi
done
4、while循环
while [ 条件表达式 ]
do
循环语句块
done
注:shell中的while与C中的运行逻辑完全一样
八、循环控制语句
break
continue
注:shell中的循环控制语句与C中的break和continue关键字的效果完全一样
九、了解shell 的函数
1、 函数定义:
函数名()
{
命令块
}
2、函数调用 :
函数名
3、参数传递: 使用位置变量
eg:在终端打印hello world并计算1+2的值
#!/bin/bash
func()
{
echo "hello world"
return 0
}
sum()
{
a=`expr $1 + $2`
echo a=$a
return 0
}
#调用函数func
func
#使用命令置换方式调用sum函数
#A=`sum 1 2`
sum 1 2
#echo A=$A
结果展示: