赞
踩
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"
-
变量: 多用于代指文件名,即各种名字或参数命令等
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文件创建成功!
结果展示:

输入:echo 输出字符串
输出:read 从终端读取字符串
expr 数学表达式
注:1、 每个符号与数值 间都要有空格分开
2、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 更旧
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

结果展示:

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
-

结果展示:
结构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
-

while [ 条件表达式 ]
do
循环语句块
done
注:shell中的while与C中的运行逻辑完全一样
break
continue
注:shell中的循环控制语句与C中的break和continue关键字的效果完全一样
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
-
-

结果展示:

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。