1 shell编程
1.1 shell脚本的作用
1.1.1 shell命令
-
用户主目录下创建一个文件夹 23041/day1 mkdir -p ~/23041/day1
-
进入到用户主目录下的23041/day1 cd ~/23041/day1
-
在day1目录下创建一个空文件 1.txt touch 1.txt
shell脚本后缀为 .sh
1.2 shell语法
1.2.1 与C语言比较
-
都属于计算机语言
-
C语言是编译性语言(编译器 gcc),强类型语言,数据类型比较多
-
shell语言是解释性语言,弱类型语言
1.2.2 shell开发过程
-
创建一个后缀名为
.sh
的文件touch 1.sh
-
编辑 .sh 文件
#!/bin/bash
相当于C语言的头文件
- 修改文件权限
- 运行 .sh 文件
1.3 变量
1.3.1 用户自定义变量
1.3.1.1 变量名的命名规则
-
由数字,字母和下划线组成,首字母不能为数字
-
不能为关键字或保留字
-
尽量见名知意,尽量大写
1.3.1.2 变量名的语法规则
1.3.2 位置参数即命令行参数
位置参数由系统提供的参数
1.3.3 预定义变量
$# :包含命令行参数的个数
$@ :包含所有命令行参数
$* :包含所有命令行参数
$$:包含正在执行进程的ID号
$?:包含前一个命令的退出状态,正常退出是0(真),反之为非0值(假)
ps -ef 查看所有进程及其PID(进程号),系统时间,命令详细目录,执行者等
ps aux 除了可显示-ef所有内容之外,还可显示CPU及内存占用率,进程状态
1.3.4 环境变量
1.3.4 shell中的程序和语句
1.3.4.1 说明性语句 (注释)
#我是注释
1.3.4.2 功能性语句
1.3.4.2.1 键盘读入变量值read
1.3.4.2.2 算术运算命令 expr
expr主要用于简单的整数运算
1.3.4.3 test命令:字符串 整数 文件属性
1.3.4.3.1 字符串
s1 = s2 测试两个字符串的内容是否完全一样
s1 !=s2 测试两个字符串的内容是否有差异
-z s1 测试字符串的长度是否为0
-n s1 测试s1字符串的长度是否不为0
1.3.4.3.2 整数
a -eq b 测试a与b是否相等 (equal)
a -ne b 测试a与b是否不相等
a -gt b 测试a是否大于b (great)
a -ge b 测试a是否大于等于b
a -lt b 测试a是否小于b (little)
a -le b 测试a是否小于等于b
1.3.4.3.3 文件属性
7种文件:
-
普通文件 d 目录文件 l 链接文件 p 管道文件 s 套接字(socket)文件 c:字符设备文件 b:块设备文件
-
-d name 测试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 测试文件s1是否比文件f2更旧
1.3.4.4 结构性语句
1.3.4.4.1 选择结构
1.3.4.4.1.1 单分支选择结构
if 表达式
then 命令表
fi
1.3.4.4.1.2 双分支选择结构
if 表达式
then 命令表1
else 命令表2
fi
1.3.4.4.1.3 多分支选择结构
if 表达式1
then 命令表1
elif 表达式2
then 命令表2
elif 表达式3
then 命令表3
......
elif 表达式n
then 命令表n
else 命令表n+1
fi
case 字符串常量 in #测试字符串是否等于模式
模式1)
命令表1
;; #类似于break
模式2)
命令表2
;;
模式3)
命令表3
2.循环结构
1.for语句
1.带列表for语句
;;
......
模式n)
命令表n
;;
*) #default 表示模式都不匹配
命令表n+1
;;
esac
1.3.4.4.2 循环结构
1.3.4.4.2.1 带列表 for语句
for 变量名 in 列表
do
命令表
done
1.3.4.4.2.2 不带列表for语句
1.3.4.4.2.3 类似于C语言的for语句
1.3.4.4.2.4 while语句
while 命令或表达式
do
命令表
done
1.4 函数
1.4.1 定义
方式一:
function_name()
{
}
方式二:
function function_name()
{
}
#编写两个数求和的函数
function add()
{
#$1:你传进来第一个参数
#$2:你传进来第二个参数
SUM=`expr $1 + $2` #将传进来的参数进行算术运算求和
return $SUM #返回结果
}
1.4.2 函数的调用
方式一:
SUM=`functio_name 参数列表(空格隔开)`
echo $SUM
#调用add函数的时候
SUM=`add 23 45`
echo $SUM
方式二:
function_name 参数列表(空格隔开)
add 23 45
echo $? #$?表示上一个命令退出的状态
2 shell案例
2.1 案例1
请输入一个文件,判断它是否是普通文件,如果是普通文件,判断它是否有写的权限,
如果有写的权限,向文件中写入"hello world"
如果文件没有写的权限,给它添加写权限后,写入"hello world"
2.2 案例2
请输入想要下载的文件的名字,让用户确认下是否下载这个软件[Y/N/Q]。
Y(YES|Yes|yes|y|Y):正在下载软件,N:取消下载软件,Q退出
2.3 案例3
2.4 案例4