shell编程规范
1.shell简介
1. shell脚本是什么
只要将平时的各种Linux命令按顺序保存到一个文本文件中,然后添加可执行权限,这个文件就成为一个Shell脚本了,就是复杂问题简单化。
2.shell脚本应用场景
- 重复性操作
- 交互性任务
- 批量事务处理
- 服务运行状态监控
- 定时任务执行
3.Shell脚本的作用
- 介于系统内核(操作系统)与用户(应用层)之间,复制解释命令行,俗称命令解释器,“翻译官”
- 用户写的命令通过Shell翻译成二进制,才可以被内核识别,去控制硬件
4.Linux常用的Shell种类
不同的shell具备不同的功能,shell还决定了Linux中默认的shell是/bin/ bash,流行的shell有ash、bash、ksh、csh, zsh等,不同的shell 都有自己的特点以及用途。
-
bash
大多数Linux系统默认使用的shell , bash shell是Bourne shell 的一个免费版本,它是最 早的Unix. shell, bash还有一个特点,可以通过help命令来查看帮助。包含的功能几乎可以涵盖shell所具有的功能,所以一般的shell脚本都会指定它为执行路径。 -
csh
C shell 使用的是“类C”语法,csh是具有C语言风格的一种shell, 其内部命令有52个,较为庞大。目前使用的并不已经被/bin/tcsh所取代。 -
ksh
Korn shell 的语法与Bourne shell相同,同时具备了C shell的易用特点。许多安装脚本都使用ksh, ksh有42条内部命令,与bash相比有一定的 限制性。 -
tcsh
tcsh是csh的增强版,与C shell完全兼容。 -
sh
是一个快捷方式,已经被/bin/bash所取代。 -
nologin
指用户不可登录
2.编写Shell脚本格式
1.编写脚本代码
要求:
使用vim或vi文本编辑器
每行一条Linux命令,按执行顺序依次编写
#!/bin/bash
#查询/boot目录下的所有的子文件和子目录
shell脚本命令
cd /boot
pwd
ls -lh vml*
2.赋权限和执行
-
赋权限
[root@server2 ~]# chmod +x first.sh
-
执行脚本文件
[root@server2 ~]# ./first.sh
3.完整表示
[root@server2 ~]# vim first.sh
[root@server2 ~]# chmod +x first.sh
[root@server2 ~]# ./first.sh
#!/bin/bash
#查询/boot目录下所有的子文件和子目录
cd /boot
echo "当前位于:" 输出友好提示信息
pwd
echo “显示当前路径下以vml为开头的文件或目录:”
ls -lh vml*
3.重定向
1.重定向是什么
在实际的Linux系统维护中,可以改变输入、输出内容的方向,而不使用默认的标准输入、输出设备(键盘和显示器),这种操作称为重定向。(改变输入来源,输出目标)
2.交互式硬件设备标准输入:从该设备接收用户输入的数据
-
标准输入:从该设备接收用户输入的数据
-
标准输出:通过该设备向用户输出数据
-
标准错误:通过该设备报告执行出错信息
类型 设备文件 文件描述编号 默认设备 标准输入 /dev/stdin 0 0< 键盘 标准输出 /dev/stdout 1 1> 显示器 标准错误输出 /dev/stderr 2 2> 显示器
3.重定向分类
类型 操作符 用途
重定向输入 (0)< 从指定的文件读取数据,而不是从键盘输入
重定向输出 (1)> 将输出结果保存到指定的文件(覆盖原有内容)
(1)>> 将输出结果追加到指定的文件尾部
标准错误输出 2> 将错误信息保存到指定的文件(覆盖原有内容)
2>> 将错误结果追加到指定的文件中
混合输出 &>或者2>&1 将标准输出,标准错误的内容保存到同一个文件中
4.shell变量
1.变量的作用
用来存放系统和用户需要使用的特定参数(值)
- 变量名:使用固定的名称。 由系统预设或用户定义
- 变量值:能够根据用户设置。 系统环境的变化而变化
2.变量的类型
-
自定义变量:由用户自已定义。 修改和使用
定义一个新的变量
要求:变量名以字母或下划线开头、区分大小写,建议全大写
格式:变量名=变量值(“=”左边为变量名,右边为变量值) -
特定变量: 环境变量 , 只读变量 ,位置变量 , 预定义变量
3. 查看变量的值
格式:echo $变量名
[root@server2 ~]# A=cc
[root@server2 ~]# echo $A
cc
[root@server2 ~]# AB=ccdd
[root@server2 ~]# echo $A $AB
cc ccdd
4.赋值时使用引号
-
双引号:允许通过符 号 引 用 其 他 变 量 值 单 引 号 : 禁 止 引 用 其 他 变 量 值 , 符号引用其他变量值
-
单引号:禁止引用其他变量值,符号引用其他变量值单引号:禁止引用其他变量值,示为普通字符
-
反撇号:命令替换。提取命令执行后的输出结果
read [-p "提示信息"] 变量名 [root@server2 ~]# $PATH -bash: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin: 没有那个文件或目录 [root@server2 ~]# Z='$PATH' [root@server2 ~]# echo $Z $PATH [root@server2 ~]# Z="$PATH" [root@server2 ~]# echo $Z /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin [root@server2 ~]# B=`ls -lh /root` [root@server2 ~]# echo $B
5.设置变量的作用范围
变量分为:局部、全局
格式1:export 变量名 ... #两种格式可以混合使用
格式2:export 变量名=变量值 ...
变量名=变量值 … 局部(在当前的bash可用,切换到其它bash不可用)
[root@localhost ~]# echo "$Product $Version"
Benet 6.0
[root@localhost ~]# export Product Version #导出为全局变量
[root@localhost ~]# bash
[root@localhost ~]# echo "$Product $Version" #子程序引用全局变量
Benet 6.0
[root@localhost ~]# exit
[root@server2 ~]# export S='door'
[root@server2 ~]# echo $S
door
[root@server2 ~]# bash
[root@server2 ~]# echo $S
door
[root@server2 ~]# exit
exit
[root@server2 ~]# env
6.整数变量的运算
-
常用运算符
加法运算:+ 减法运算:- 乘法运算:\* (\:转义字符,回归本身意思)注意不能仅使用“*”符号,否则将被当成文件通配符 除法运算:/ 求模(取余)运算:% 又称为取余运算,用来计算数值相除后的余数 元字符:具有特殊含义
两个数+、一、*、/、%的方法有三种
[root@server2 ~]# expr 1 + 4
5
[root@server2 ~]# echo $((1+4))
5
[root@server2 ~]# echo $[1+4]
5
[root@server2 ~]# expr 1 - 4
-3
[root@server2 ~]# echo $[1-4]
-3
[root@server2 ~]# echo $((1-4))
-3
[root@server2 ~]# expr 1 \* 4
4
[root@server2 ~]# echo $((1*4))
4
[root@server2 ~]# echo $[1*4]
4
[root@server2 ~]# expr 1 / 4
0
[root@server2 ~]# echo $((1/4))
0
[root@server2 ~]# echo $[1/4]
0
注:乘法在直接使用过程中是需要的,因为是shell正则表达式中的特殊字
符,所以需要转义字符\才能表示其真实含义,但是在(())和[]中不需要转义字
符。
7.特殊的Shell变量
-
环境变量
由系统提前创建,用来设置用户的工作环境
配置文件: /etc/profile、 ~/.bash_ profile(当前用户)
全局工作环境的变量,针对这个系统中所有用户都会指定
当前用户root指定 -
常见的环境变量
PWD、PATH
USER、SHELL、 HOME
改变系统环境变量
[root@server2 ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@server2 ~]# PATH="$PATH:/opt"
[root@server2 ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/opt
-
只读变量
用于变量值不允许被修改的情况[root@localhost ~]# name=cloud [root@localhost ~]# readonly name //设置为只读变量 [root@localhost ~]# echo $name cloud [root@localhost ~]# name=yun -bash: name: readonly variable //只读变量不可以被重新赋值 [root@localhost ~]# unset name //只读变量不可以被删除 -bash: unset: name: cannot unset: readonly variable
-
位置变量
表示为$n,n为1~9之间的数字 $0 $2,第2个位置参数 [root@localhost ~]# ./myprog.sh one two three four five six $1,第1个位置参数 [root@server2 ~]# vi useradd.sh [root@server2 ~]# chmod +x useradd.sh [root@server2 ~]# ./useradd.sh ponmeng [root@server2 ~]# tail /etc/passwd #!/bin/bash #add user useradd $1 passwd --stdin $1 < pass.txt
-
预定变量
[root@server2 ~]# vi /etc/resolv.conf [root@server2 ~]# systemctl restart network [root@server2 ~]# date [root@server2 ~]# vim bak.sh [root@server2 ~]# chmod +x bak.sh [root@server2 ~]# ./bak.sh /boot /etc /opt 已执行./bak.sh脚本 已执行3个对象备份 打包文件:/boot /etc /opt #!/bin/bash# 打包文件 g=bak-`date +%F`.gz tar zcvf $g $* &> /dev/null echo "已执行$0脚本" echo "已执行$#个对象备份" echo "打包文件:$*" [root@server2 ~]# vim bak.sh 编辑替换$*改为$@,查看效果 [root@server2 ~]# ./bak.sh /boot /etc /opt 已执行3个对象备份 打包文件:/boot /etc /opt #!/bin/bash # 打包文件 g=bak-`date +%F`.gz tar zcvf $g $@ &> /dev/null echo "已执行$0脚本" echo "已执行$#个对象备份" echo "打包文件:$*"