shell编程基础
shell脚本的用途
自动化常用命令
执行系统管理和故障排除
创建简单的应用程序
处理文本或文件
创建shell脚本过程
第一步:使用文本编辑器来创建文本文件
第一行必须包括shell声明序列:#!
#!/bin/bash
第二步:加执行权限
给予执行权限,在命令行上指定脚本的绝对或相对路径
第三步:运行脚本
直接运行解释器,将脚本作为解释器程序的参数运行
脚本注释规范
1、第一行一般为调用使用的语言
2、程序名,避免更改文件名为无法找到正确的文件
3、版本号
4、更改后的时间
5、作者相关信息
6、该程序的作用,及注意事项
7、最后是各版本的更新简要说明
第一个脚本
备份etc下的文件到data下并以etcYY-mm-hh命名
echo -e "\033[1;32mStarting backup...\033[0m"
sleep 2
cp -av /etc/ /data/etc`date +%F`
echo -e "\033[1;32mBackup is finished...\033[0m"
脚本调试
bash -n script
注意:只能检查语法错误
调试执行
bash -x script
Shell中变量命名法则
1,不能使程序中的保留字:如:if, for
2,只能使用数字、字母及下划线,且不能以数字开头
3,见名知义,用英文名字,并体现出实际作用
4,统一命名规则:驼峰命名法, studentname,大驼峰StudentName 小驼峰studentName
5,变量名大写
6,局部变量小写
7,函数名小写
变量的生效范围
普通变量:只在当前shell生效对于父shell和子shell均不生效
环境变量:在当前shell和子shell中生效,对于父shell不生效
变量赋值
[root@centos7|13|data]#name=root \\变量赋值
[root@centos7|14|data]#echo $name
root
[root@centos7|15|data]#usr=$name \\变量引用
[root@centos7|16|data]#echo $name
root
[root@centos7|20|data]#ti=`date` \\命令引用 格式一
[root@centos7|21|data]#echo $ti
2019年 12月 25日 星期三 08:44:50 CST
[root@centos7|22|data]#Ti=$(date) \\命令引用格式二
[root@centos7|23|data]#echo $Ti
2019年 12月 25日 星期三 08:45:15 CST
强引用于弱引用
[root@centos7|24|data]#name=date
[root@centos7|25|data]#echo "$name" \\弱引用 其中变量引用会被替换为变量值
date
[root@centos7|26|data]#echo '$name' \\强引用 其中变量引用不会替换为变量值,而是保持原字符串
$name
[root@centos7|27|data]#echo `$name` \\变量中的命令会被引用
2019年 12月 25日 星期三 08:49:34 CST
显示已定义的变量
set
删除变量
unset name
环境变量
声明:export name=VALUE
declare -x name=VALUE
变量引用
$name
${name}
显示环境变量
env
声明只读变量
readonly name
查看只读变量
readonly
位置变量
位置变量:在bash shell中内置的变量, 在脚本代码中调用通过命令行传递给脚本的参数
$1, $2, ... 对应第1个、第2个等参数,shift [n]换位置
$0 命令本身,包括路径
$* 传递给脚本的所有参数,全部参数合为一个字符串
$@ 传递给脚本的所有参数,每个参数为独立字符串
$# 传递给脚本的参数的个数
注意:$@ $* 只在被双引号包起来的时候才会有差异
例:
[root@centos7|712|script]#cat set.sh
#!/bin/bash
echo $1
echo $2
echo $3
echo $4
echo $5
echo $6
echo $7
echo $8
echo $9
echo $0
echo $*
echo $@
echo $#
[root@centos7|713|script]#bash set.sh 1 2 3 4 5 6 7 8 9
1
2
3
4
5
6
7
8
9
set.sh
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
9
清空所有位置变量
set –
命令执行后
输入echo $?若返回0则成功若返回非0则失败
用户可以在脚本中使用以下命令自定义退出状态码 exit 数字
注意:
脚本中一旦遇到exit命令,脚本会立即终止;终止退出状态取决于exit命令后面的数字
如果未给脚本指定退出状态码,整个脚本的退出状态码取决于脚本中执行的最后一条命令的状态码
反斜线(\)会使随后的字符按原意解释
[root@centos7|716|script]#echo "\$5"
$5
set命令实现脚本安全
可在脚本中加入set -ue
-u在扩展一个没有设置的变量时,显示错误信息
-e如果一个命令返回一个非0退出状态值(失败)就退出
算数运算
[root@centos7|717|script]#i=10
[root@centos7|718|script]#j=20
[root@centos7|719|script]#let var=i*j
[root@centos7|720|script]#echo $var
200
(1) let var=算术表达式
(2) var=
[
算
术
表
达
式
]
(
3
)
v
a
r
=
[算术表达式] (3) var=
[算术表达式](3)var=((算术表达式))
生成一个随机数
[root@centos7|721|script]#echo $[$RANDOM%7]
3
[root@centos7|722|script]#echo $[$RANDOM%7]
4
[root@centos7|723|script]#echo $[$RANDOM%7]
3
[root@centos7|724|script]#echo $[$RANDOM%7]
0
变量测试
[ -v var ]
echo $?
0为设置
非0未设置
数值测试
-gt 是否大于
-ge 是否大于等于
-eq 是否等于
-ne 是否不等于
-lt 是否小于
-le 是否小于等于
字符串测试
[ -z var ] 空为真,非空为假
[ -n var ] 空为假,非空为真
!=
=
[[ = ]]
[[ =~ ]]用于正则表达式
2.10.4 文件测试
-a FILE:同 -e
-e FILE: 文件存在性测试,存在为真,否则为假
-b FILE:是否存在且为块设备文件
-c FILE:是否存在且为字符设备文件
-d FILE:是否存在且为目录文件
-f FILE:是否存在且为普通文件
-h FILE 或 -L FILE:存在且为符号链接文件
-p FILE:是否存在且为命名管道文件
-S FILE:是否存在且为套接字文件
文件权限测试
-r FILE:是否存在且可读
-w FILE: 是否存在且可写
-x FILE: 是否存在且可执行
-u FILE:是否存在且拥有suid权限
-g FILE:是否存在且拥有sgid权限
-k FILE:是否存在且拥有sticky权限
流程控制
if语句
格式
if [ 条件 ];then 命令 ;
elif [ 条件 ];then 命令; 可选项
else 命令;
fi
case语句
case 变量引用 in
1|2|3)
命令一
;;
4|5|6)
命令二
;;
*)
命令三
;;
esca
脚本示例
通过位置变量创建 Linux 系统账户及密码