一、shell脚本编程学习概述
(一)、学习shell脚本原因
提升工作效率
减少重复工作
完成批量操作
节省人力成本
(二)、学习shell必备知识
1、熟练使用编辑软件
vim
2、熟练使用常用命令
150个常用命令
三剑客命令
3、熟练使用系统符号
系统常用符号
系统通配符号
系统正则符号
(三)、学习shell方法技巧
(一)、技巧方法
会看脚本
模仿编写
(二)、高手核心
量的积累,产生质的变化
(三)、学习误区
依赖高手,拿来主义
二、shell脚本概念
Shell是一个命令解释器,它的作用是解释执行用户输入的命令及程序等
(一)、解释器工作方式
采用交互式方式进行解释
采用非交互式方式进行解释
(二)、shell种类
/bin/sh ---> 是bash一个软链接
/bin/bash ---> linux系统默认使用shell解释器
/sbin/nologin ---> 无法登陆访问shell
/usr/bin/csh
/usr/bin/rsh
三、shell脚本需掌握内容
(一)、掌握脚本基本语法
1、变量设定
普通变量
定义方式
先写变量名称,紧接着是 "=" ,最后是值。中间无任何空格
调用变量
通过echo命令加上 $变量名,即可输出变量的值。
双引号,以防止出错变量的值一般要加上
变量永久生效
将变量设置编写到文件中
(/etc/profile /etc/bashrc ~/.bashrc ~/.bash_profile)
环境变量
定义方式
export info=“I am HQ”
调取变量
echo $info
永久生效:
将变量设置编写到文件中
(/etc/profile /etc/bashrc)
条件表达式
if判断语法
单分支语句
if [ ]
then #则
命令
fi
双分支语句
if [ ]
then #则
命令
else #否则
命令
fi
多分支语句
if [ ]
then
elif [ ]
then
elif [ ]
then
else
fi
for循环
while循环
case语句
函数语法规范
数组
(二)、定义变量规范:
变量不能使用数字开头
定义变量时“=”两边不能有空格
变量建议由字母与“_”组成
变量设置见名知其义
1、养成脚本编写规范
脚本保存目录规范
将脚本文件统一保存在指定目录中
2、脚本编写规范
1、一个规范的Shell脚本在第一行会指出由哪个程序(解释器)来执行脚本中的内容
2、在shell脚本中,跟在 # 后面的内容表示注释,用来对脚本进行注释说明,
注释部分不会被当做程序来执行,仅仅是给开发者和使用者看的,系统解释器是看不到的,更不会执行
3、Shell脚本的开头会加版本、版权等信息
# Date:16:29 2018-10-20 --> 脚本编写时间
# Author: Create by xiaoxie --> 脚本作者
# Description: This script function is …… -->脚本作用
4、在shell脚本中尽量不用中文注释,尽量用英文注释,防止本机或切换系统环境后中文乱码的困扰
5、Shell脚本的命名应以.sh为扩展名 例如:This is a premium name
6、成对的符号应尽量一次性写出来,然后退格在符号内增加内容,以防止遗漏。这些成对的符号包括: {}、[]、‘’、“” 等
7、中括号[]两端至少要有1个空格,因此,键入中括号时即留出空格[ ],
然后在退格键入中间内容,并确保两端都至少由一个空格
8、对于流程控制语句,应一次性将格式写完,再添加内容
如:一次性完成for循环语句的格式
9、通过缩进让代码更易读
10、对于常规变量的字符串定义变量值应加双引号,并且等号前后不能有空格,
需要强引用的,则用单引号(‘’),如果是命令的引用,则用反引号(``)
11、脚本中的单引号、双引号及反引号必须为英文状态下的符号
3、脚本运行方法
方法一:利用bash解释器命令运行脚本
[root@web01 /server/scripts/sh]# bash test01.sh
方法二:利用脚本绝对路径运行脚本
[root@web01 /server/scripts/sh]# /server/scripts/sh/test01.sh
方法三:利用 . 或者 source执行脚本
[root@web01 /server/scripts]# . /server/scripts/test01.sh
[root@web01 /server/scripts]#source /server/scripts/test01.sh
说明:三种方式区别
方法一 和 方法二 都是在子shell中执行脚本
方法三在父shell中进行运行
四、shell变量的设置
(一)、变量的赋值方法
方法一:直接赋值
a=1
方法二:传参赋值
a=$1
方法三:交互式赋值
read 变量名
read -p "提示信息" 变量名
read -t “输入超时时间” 变量名
(二)、脚本中特殊变量
位置变量
$0 用于获得脚本名称信息
应用示例
echo "Usage: $0 {请写入学生年龄和姓名}"
echo "学生名字: $1"
echo "学生年龄: $2"
$n 脚本的第n个传参数,n表示从1-9,大于9参数数量 使用${10}
应用示例
echo $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10}
$# 位置参数的数量
应用示例
[ $# -eq 2 ] || echo "Usage: $0 {请写入学生年龄和姓名}"
$* 所有位置参数的内容,加引号时表示将多个参数作为一个整体
$@ 所有位置参数的内容,加引号时会将多个参数作为个体
不加双引号没有任何区别,将所有参数信息全部显示
加上双引号, 在循环体中,$* 会将所有参数看成一个整体,$@ 会将所有参数看成多个个体
状态变量
$? 获取上一个命令执行结果 成功用0 失败用非0
示例应用
[ $# -ne 1 ] && echo "Usage: $0 {请输入一个域名信息!}" && exit 2
ping -c 2 $1 &>/dev/null
[ $? -eq 0 ] && echo "This web_name $1 is ok. " || echo "This web_name $1 is error
$$ 获取一个脚本执行PID信息
示例应用
# $$ 获取脚本执行进程信息
echo $$ >/tmp/test.pid
$! 获取上一个程序或脚本后台运行的pid信息
示例应用
[root@web01 scripts ]# sh test04.sh & --- 让脚本在后台运行
[1] 118411
[root@web01 scripts ]# echo $! --- 获取上一个在后台运行脚本pid信息
118411
[root@web01 scripts ]# jobs --- 查看在后台运行的程序信息
[1]+ 运行中 sh test_ip.sh &
[root@web01 scripts ]# fg 1 --- 恢复后台运行程序到前台