shell及shell脚本
1、shell — 命令解释器
2、shell脚本 — 将多个命令有序的结合起来,命令的有序集合
注意事项:Shell对格式有严格要求比如空格以及一些标点符号
shell编程 #注释
shell脚本创建过程:—解释性的编程语言,不需要编译
- 创建文件 touch text.sh
- 赋予执行权限 chmod 777 text.sh
- 写入一行 #!/bin/bash #shell使用解释器
变量 特点
1.没有数据类型
2.所有的数据均解释为字符串
3.所有变量的引用均是字符串替换
用户自定义变量
1.定义和赋值 A= a123 变量名使用大写,与等号没有空格,赋值数据可以有空格
2.使用 $A
3.清除变量 unset A #清除定义和值
位置变量
- 以$开头,$0-$9
- $0 命令本身 例如 ls 不跟参数
- $1 第一个参数作用:运行时传递参数;函数参数传递
- $# 命令行参数的个数
- $* $@ 表示命令行说有的参数
- $? 上一个命令的执行状态 0正常退出 非0 异常退出
- $$ 获得当前脚本的PID 环境变量—不需要定义
7.1.USER 用户名
7.2.PATH shell的搜索路径 预定义变量—运维,系统维护使用
*功能性语句
1、输出语句: C – printf S – echo
2、 输入语句: C – scanf S – read #读终端输入值放入变量
read 变量列表 #读终端输入值放入变量列表,多个变量。输入空格隔开,如果超过变量数,多的放在最后一个
3、算数运算命令:expr 支持 + - * / %(必须是整型)
使用 expr 表达式
= 两边紧挨内容 C=expr $A + $B
#—将A和B的值相加赋给C
4、 测试指令:
- : 字符串测试
s1 = s2 测试两个字符串的内容是否完全一样
s1 != s2 测试两个字符串的内容是否有差异
-z s1 测试s1 字符串的长度是否为0
-n s1 测试s1 字符串的长度是否不为0 - : 整数测试
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
note: test语句执行成功(满足条件) 返回结果0 失败返回1 - : 文件测试
-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更旧
test f1 -nt f2
$? = 1
结构性语句
1、分支结构
if [ 条件 ]
then
命令块
fi
if [ 条件 ]
then
命令块 1
else
命令块 2
fi
if [ 条件 ]
then
命令块 1
else
if [ ]
then
fi
fi
2、多路分支:
case 选择条件 in
匹配条件1)
语句块
;;
匹配条件1)
语句块
;;
.... *)
语句块 匹配其他
;;
esac
3、循环结构:
结构1:
for 变量名 in 变量列表
do
循环语句块
done
read
结构2:
for (( i=0;i<10;i++ ))
do
done
while:
while [ 条件 ]
do
命令块
done
seq命令:构造数列,seq 起始数 增量 终止值
seq 0 2 100
until:
until [ 条件 ]
do
命令块
done
break;continue;
break n;continue n;
跳出n层
函数:
定义:
方式1:
func() {
命令块 ---至少有一句,不能为空
}
方式2:
function func() {
命令块
}
函数调用
函数名
方式1: func 参数传递 函数名 参数列表
func 1 2 3
func() {
echo $1,
echo $2,
echo $3
}
方式2:
使用命令置换
C=func 参数列表
脚本中,默认方式定义的变量都是全局变量。
局部变量的定义 需要用 local 修饰
练习
1.输入n个数,求和?# 功能描述:输入n个数,求和
2.打印当前目录中所用的普通文件。
3.删除指定目录中所有的空文件。