Shell 脚本编程规范
应用场景
Shell脚本(Shell Script)就是将要执行的命令按顺序保存到一个文本文件,并给该文件可执行权限,方便一次性执行的一个程序文件。主要是方便管理员进行设置或管理,常用语重复性操作、批量事务处理、自动化运维、服务运行状态监控、定时任务执行等。
Shell 编程规范
什么是Shell
Linux系统中的Shell脚本是一个特殊的应用程序,它介于操作系统内核与用户之间,充当了一个“
命令解释器
”的角色。负责接收用户输入的操作指令(命令)并进行解释,将需要执行的操作传递给内核执行,并输出执行结果。
常见的Shell解释器程序
[root@zzq ~]# cat /etc/shells/bin/sh/bin/bash/sbin/nologin/usr/bin/sh/usr/bin/bash/usr/sbin/nologin/bin/tcsh/bin/csh
其中,/bin/bash 是目前大多数Linux版本采用的默认shell脚本。
什么是“shell脚本”
?简单来说,只要将平时使用的各种Linux命令按顺序保存到一个文本文件,然后添加可执行权限,这个文件就成为一个Shell脚本了。
例如:
[root@zzq ~]# vi frist.sh #新建frist.sh 文件#!/bin/bash#?脚本声明,表示此行以后的语句通过/bin/bash程序来解释执行#This is a test Shell-Scriptcd /boot/echo \"当前的目录位于:\"pwdecho \"其中以vml开头的文件包括:\"ls -lh vml*[root@zzq ~]# chmod +x frist.sh #添加可执行权限
运行一下
[root@zzq ~]# ./frist.sh #直接运行脚本文件当前的目录位于:/boot其中以vml开头的文件包括:-rwxr-xr-x. 1 root root 6.0M 5月 27 19:13 vmlinuz-0-rescue0cc6a8c20e8b4ea798a8765297ee4a11-rwxr-xr-x 1 root root 6.5M 6月 23 23:50 vmlinuz-3.10.0-1127.13.1.el7.x86_64-rwxr-xr-x. 1 root root 6.0M 4月 21 2018 vmlinuz-3.10.0-862.el7.x86_64[root@zzq ~]#
执行脚本还有几种方式
1、绝对路径 和‘./’一样需要脚本文件有写权限[root@zzq ~]# /root/frist.sh2、通过/bin/sh来解释脚本[root@zzq ~]# sh frist.sh3、使用source命令执行[root@zzq ~]# source frist.sh
管道与重定向
管道操作
管道操作为不同命令之间的协同工作提供了一种机制,位于管道符号“|” 左侧的命令输出的结果,将作为右侧命令的输入,同一行命令中可以使用多个管道。
命令1 | 命令2 [... | [命令n][root@zzq ~]# grep \"/bin/bash$\" /etc/passwd | awk -F: \'{print $1,$7}\'root /bin/bashzzq /bin/bashzeng /bin/bashqiang /bin/bash
?中,awk命令的作用是以冒号“:” ,作为分隔,输出第一和第七个区域的字符串。
其中“-F”部分用来指定分隔符号(未指定时,默认以空格或制表符分隔)。
重定向操作
2.Linux 文件描述符
文件描述符可以理解为 Linux 系统为文件分配的一个数字,范围是 0-3 ,用户也可以自定义文件描述符,但是自定文件描述符不在这里的讨论范围
一般情况下,每个 Unix/Linux 命令运行时都会打开三个文件:
标准输入文件(stdin):stdin的文件描述符为0,Unix程序默认从stdin读取数据。
标准输出文件(stdout):stdout 的文件描述符为1,Unix程序默认向stdout输出数据。
标准错误文件(stderr):stderr的文件描述符为2,Unix程序会向stderr流中写入错误信息。
Shell脚本变量揭秘
自定义变量
自定义变量是由系统用户自己定义的变量,只在用户自己的Shell环境中有效,因此又称为本地变量。
在编写Shell脚本程序时,通常会设置一些特定的自定义变量,以适应程序执行过程中的各种变化,满足不同的需要。
自定义新的变量
定义变量的基本格式为
“变量名=变量值”
,
等号两边没有空格
。
变量名称须以
字母或下划线开头
,名称中`不要包含特殊字符(如+、-、*、/、.、?、%、&、#等)。
[root@VM_0_13_centos ~]# abc=1[root@VM_0_13_centos ~]# cba=2
查看和引用变量的值
通过在变量名称前添加前导符号“$”,可以引用一个变量的值。使用echo命令可以查看变量,可以在一条echo命令中查看多个变量值。
[root@VM_0_13_centos /]# echo $abc $cba1 2
当变量名称容易和紧跟其后的其他字符相混淆时,需要添加大括号 “ { } ” 将其括起来,否则将无法确定正确的变量名称
。对于未定义的变量,将显示为空值。
[root@VM_0_13_centos /]# echo $a4.5 变量a4并未定义.5[root@VM_0_13_centos /]# echo ${a}4.5weixin4.5
变量赋值的特殊操作
1.双引号(\”)
双引号主要起
界定字符串
的作用,特别是
当要赋值的内容中包含空格时,必须以双引号括起来
;其他情况下双引号通常可以省略。
[root@VM_0_13_centos /]# weixin=weixin 4.5-bash: 4.5: command not found[root@VM_0_13_centos /]# weixin=\"weixin 4.5\"[root@VM_0_13_centos /]# echo $weixinweixin 4.5
在双引号范围。可以使用“$”符号引用其他变量的值
[root@VM_0_13_centos /]# QQ=\"QQ $version\"[root@VM_0_13_centos /]# echo $QQQQ 4.5
2.单引号(’)
当要赋值的内容中包含“$” “\”” “\\” 等具有特殊含义的字符时,应使用单引号括起来。
在单引号中范围内,将无法引用其他变量的值,任何字符均看作普通字符看待。
但赋值内容中包含单引号时,需
使用“\\”符号进行转义
,以免冲突。
[root@VM_0_13_centos /]# QQ=\'QQ $version\'[root@VM_0_13_centos /]# echo $QQQQ $version
3.反撇号(`)
反撇号主要用于
命令替换
,允许将执行某个命令的屏幕输出结果赋值给变量。
反撇号括起来的范围内必须是能够执行的命令行,否则将会出错。
[root@VM_0_13_centos /]# ls -lh `which useradd`-rwxr-x---. 1 root root 116K Nov 6 2016 /usr/sbin/useradd
上?述操作相当于连续执行了两条命令—先通过 which useradd 命令查找出useradd 命令的程序位置,然后根据查找结果列出文件属性。
需要注意的是,使用反撇号难以在一行命令中实现嵌套命令替换操作,这时可以改用 “ %() ” 来代替反撇号操作,以解决嵌套问题。
[root@VM_0_13_centos /]# rpm -qc $(rpm -qf $(which useradd))/etc/default/useradd/etc/login.defs
4.read命令
除了上述赋值操作外,还可以使用Bash的内置命令read来给变量赋值。read命令用来提示用户输入信息,从而实现简单的交互过程。执行时将从标准输入设备(键盘)读入一行内容,并以空格为分隔符,将读入的各字段挨个赋值给变量(多余的内容赋值给最后一个变量)。若指定的变量只有一个,则将整行内容赋值给此变量
[root@VM_0_13_centos /]# echo $a5[root@VM_0_13_centos /]# read a1[root@VM_0_13_centos /]# echo $a1
为了使交互式操作的界面更加友好,提高易用性,
read命令可以结合 “-p” 选项和“-t” 选项来设置提示信息与输入等待时间 (单位默认为秒)
,以便告知用户应该输入什么内容的相关事项和规定时间内未输入自动跳出。
[root@VM_0_13_centos /]# read -p \"请为a赋值:\" a请为a赋值:d[root@VM_0_13_centos /]# echo $ad
4.设置变量的作用范围
默认情况下,
新定义的变量只在当前的Shell环境中有效,因此成为局部变量
。当进入子程序或新的子Shell环境时,局部变量将无法再使用。
[root@VM_0_13_centos /]# echo $ad[root@VM_0_13_centos /]# bash[root@VM_0_13_centos /]# echo $a[root@VM_0_13_centos /]#
为了使用户定义的变量在所有的子shell环境中能够继续使用,减少重复设置工作,可以通过内部命令 export 将指定的变量导出为“全局变量”。可以同时指定多个变量名称作为参数
(不需使用“$”符号),变量之间以空格分隔。
[root@VM_0_13_centos /]# echo $a $bd c[root@VM_0_13_centos /]# export a b[root@VM_0_13_centos /]# bash[root@VM_0_13_centos /]# echo $a $bd c
使用 export 导出变量的同时,也可以为变量赋值,这样在新定义全局变量时就不需要再提前进行赋值了。
[root@VM_0_13_centos /]# export abc=bca[root@VM_0_13_centos /]# bash[root@VM_0_13_centos /]# echo $abcbca
数值变量的运算
shell变量的数值运算多用于脚本程序的过程控制(如循环次数、使用量比较等)。
在Bash Shell环境中,只能进行简单的整数运算,不支持小数运算。
整数值的运算主要通过内部命令
expr
进行,基本格式如下?。注意:运算符与变量之间必须有至少一个空格。
expr 变量1 运算符 变量2 [ 运算符 变量3 ]···
需要注意的是乘法运算,不能仅使用“*”符号,否则将被当成文件通配符。需要在前面加上转义符号“\\”。
除了expr命令之外,变量数值常见的命令还包括(())、let等。如果要执行简单的整数运算,只需要将特定的算术表达式用“$(( ))”
括起来即可。
[root@VM_0_13_centos /]# bb=$((1+2**3-4)) 这里的2**3的含义是2的3次方[root@VM_0_13_centos /]# echo $bb5[root@VM_0_13_centos /]# echo $((1+2**3-4))5
特殊变量
1.环境变量
环境变量指的是处于运行需要而由Linux系统提前创建的一类变量,主要用于设置用户的工作环境,包括用户宿主目录、命令查找路径、用户当前目录、登录终端等。环境变量的值由Linux系统自动维护、会随着用户状态的改变而改变。
使用
env
命令可以查看到当前工作环境下的环境变量。
[root@VM_0_13_centos /]# envUSER=root 当前用户HOME=/root 当前用户宿主目录HOSTNAME=VM_0_13_centos 主机名SHELL=/bin/bashLANG=en_US.utf8 语言和字符集PWD=/ 当前所在的工作目录PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
2.位置变量
位置变量也成位置参数,使用$1、$2、$3、$4、···、$9表示。
3.预定义变量
$0 脚本名
$* 所有的参数
$@ 所有的参数
$# 参数的个数
$$ 当前进程的 PID
$! 上一个后台进程的 PID
$? 上一个命令的返回值 0 表示成功