Shell的编程规范及变量
技能目标:一、掌握shell脚本的编程规范
二、掌握管道,重定向
三、掌握shell脚本变量
一、shell脚本编程规范
Shell脚本打概述:就是将要执行的命令按顺序保存到一个文本文件,并给于该文件一定的权限,方便一次性执行的程序文件。
Shell的作用:可以批量的处理,自动化的完成一系列的维护任务,大大减少管理员的负担。
- 通过/etc/shells可以了解当前所支持的shell脚本种类。
[root@localhost ~]# cat /etc/shells
/bin/sh
/bin/bash ####大多数linux版本采用的默认shell脚本。
/usr/bin/sh
/usr/bin/bash
/bin/tcsh
/bin/csh
2、编写shell的规划做法:第一行“#!/bin/bash”是一种特殊的脚本声明,表示此行以后的语句通过/bin/bash程序来解释执行;其他以“#”开头的语句表示注释信息;echo命令用于输出字符串,以使得脚本信息更容易读懂。
例[root@localhost ~]# vi first.sh
#!/bin/bash
#This is my first Shell-Script
cd /boot/
echo "当前的目录位于:"
pwd
echo "其中以vml开头的文件包括:"
ls -lh vml*
~
wq执行命令是三种方法:(1):./first.sh
(2):. first.sh
(3):.sh first.sh
二、掌握管道,重定向
1、管道符号是“|”将左侧的输出结果作为右侧命令的输入(处理对象),同行命令中可以使用多个管道。
[root@localhost ~]# grep "/bin/bash$" /etc/passwd ##过滤查询使用“/bin/bash”作为shell用户名时
root:x:0:0:root:/root:/bin/bash
lai:x:1000:1000:lai:/home/lai:/bin/bash
[root@localhost ~]# grep "/bin/bash" /etc/passwd | awk -F: '{print $1,$7}' ##用awk命令可以进一步过滤第一第7列的内容。(awk命令是以冒号作为分隔)
root /bin/bash
lai /bin/bash
[root@localhost ~]# df -Th | grep "/$" | awk '{print $6}' ###表示grep”/$”表示以“/”结尾的行
2%
2、重定向符号:标准输入指的是键盘标号是0;标准输出指的是显示屏编号是1;标准错误标号是2;
<符号表示重定向输入
>和>>表示重定向输出,分别用于覆盖和追加文件
重定向输入 :减少密码繁琐输入用“--stdin”选项
[root@localhost ~]# vi pass.txt ##添加初始密码串内容“lai123”
[root@localhost ~]# passwd --stdin lai < pass.txt ##从pass.txt文件中取密码
Changing password for user lai.
passwd: all authentication tokens updated successfully.
重定向输出 : 将当前主机CPU信息(uname -p)
[root@localhost ~]# uname -p > kernel.txt ##当前主机的cup信息保存到文件kernel.txt文件中(-p表示指定目录向上级目录递归)
[root@localhost ~]# cat kernel.txt ###查看kernel.txt文件中的内容
X86_64
[root@localhost ~]# uname -r >> kernel.txt保存原有内容的追加(-r表示指定目录向下级目录递归)
[root@localhost ~]# cat kernel.txt
X86_64
2.6.32-431.el6.86_64
错误重定向:使用>2操作符2表示错误文件的编号 ##同理也可以用2>>表示追加
[root@localhost ~]# tar jcf /nonedir/etc.tgz /etc/ 2> error.log ##用tar命令进行备份时出现的错误信息保存到error.log文件中
[root@localhost ~]# cat error.log
tar: Removing leading `/' from member names
tar (child): /nonedir/etc.tgz: Cannot open: No such file or directory
tar (child): Error is not recoverable: exiting now
可以用&>操作符将两类输出信息保存在同一个文件。
make &> /dev/null ###后面是相当于回收站
make install &> /dev/null
三、shell脚本的变量揭秘
Shell变量用来存放系统和用户需要使用的特定参数的值,而且这些参数可以根据用户的设定或系统环境的变化而相应的变化。常用的变量类型包括:自定义变量,环境变量,位置变量,预定义变量。
- 自定义变量
定义变量的基本格式是 “变量名=变量值”等号两边没有空格
变量名需要以字母或者下划线开头,并且名称中不要包括特殊字符(如+、-、*、/、.、?、%、&、#等)
[root@localhost ~]# Product=Weixin
[root@localhost ~]# Version=6.0
[root@localhost ~]# echo $Product ##用echo和前导符号$可以查看变量值
Weixin
[root@localhost ~]# echo $Product $Version
Weixin 6.0
[root@localhost ~]# echo $Product4.5 ##为防止混淆变量名称与其他字符需要加{}号。
.5
[root@localhost ~]# echo ${Product}4.5
Weixin4.5
- 变量的特殊赋值(如” ‘ ` read)
双引号:主要是其界定字符串的作用,特别是当赋值的内容包含空格时必须双引号括起来。
使用$符号可以应用其他变量的值(变量引用)以直接调用现有变量的值给新变量
[root@localhost ~]# Weixin=Weixin 5.0
bash: 5.0: command not found...
[root@localhost ~]# Weixin="Weixin 5.0"
[root@localhost ~]# echo $Weixin
Weixin 5.0
[root@localhost ~]# QQ="QQ $Version"
[root@localhost ~]# echo $QQ
QQ 6.0
单引号:当需要赋值的内容中有特殊字符时要用单引号括起来。单引号内的特殊字符均以普通字符看待。赋值内容包含但引号用“\’”符号进行转义,以免冲突。
[root@localhost ~]# QQ='QQ $Version'
[root@localhost ~]# echo $QQ
QQ $Version ##符号不在引用变量原样输出字符串
反撇号:用于命令替换,允许将执行某个命令的屏幕输出结果赋值给变量。反撇号括起来的范围必须是能够执行的命令行,不然将出错。
[root@localhost ~]# ls -lh `which useradd` ##先查找位置在根据结果列出文件属性
-rwxr-x---. 1 root root 116K Oct 31 2018 /usr/sbin/useradd
使用反撇号难以在一行命令中实现嵌套命令替换操作,这时候可以改用“$()”来代替反撇号操作,已解决嵌套的问题。
[root@localhost ~]# rpm -qc $(rpm -qf $(which useradd))
/etc/default/useradd ##查看提供useradd命令程序的软件包所安装的配置文件位置。
/etc/login.defs
Read命令:使用bash的内置命令read来给变量赋值。Read提示用户输入信息。从而实现信息交互过程。执行时将从标准输入设备(键盘)读入一行内容,并以空格为分隔符,将读入的各字段挨个赋值给指定的变量(多余命令赋予给最后一个变量),若指定的变量只有一个则将正行内容赋值给此变量。 read命令可以结合-p和-t选项来设置提示信息和输入的等待时间(单位为秒),以便告知用户应该输入什么内容等相关事项的规定时间内未输入自动跳出。
[root@localhost ~]# read ToDir1
/opt/backup/
[root@localhost ~]# echo $ToDir1
/opt/backup/
[root@localhost ~]# read -p "请指定备份存放目录:" ToDir2
请指定备份存放目录:/opt/backup
[root@localhost ~]# echo $ToDir2
/opt/backup
设置变量的作用范围
局部变量:默认情况下新定义的变量只在当前的shell环境中有效。当进入子程序或者子shell环境中时,局部变量将无法在使用。当然也可以使用Export将指定的变量导出“全局变量”可以指定多个变量名称做参数(无需$符号)变量名之间空格分开 使用export导出全局变量的同时,可以为变量进行赋值,这样在新定义全局变量时就不需要提前进行赋值。
数值变量的运算bash shell环境中,只能简单运算不支持小数运算,整数运算主要通过expr命令进行。运算符与变量之间必须有一个空格。
如果执行简单的整数运算,只需要将特定对的算术表达式用“$((”和“))”括起来即可。
- 特殊变量:包括环境变量;位置变量;预定义变量;
环境变量:指出于运行需要而由LINUX系统提前穿件的一类变量,主要用于设置用户的工作环境,包括用户宿主目录、命令查找路径、用户当前目录、登录终端等。
位置变量:为方便shell使用脚本程序时,方便通过命令行为程序提供超作参数,bash引入了位置的概念
预定义变量:bash预先定义好的一个特殊变量。常用$符号和另一个符号表示,含义如下:
$#:表示命令行中位置参数的个数
$*:表示所有位置参数的内容
$?:表示前一条命令执行后的返回状态,0是正常非0是表示出现异常。
$0:表示当前执行的脚本或程序的名称
[root@localhost ~]# chmod +x mybak.sh ##添加执行权限
[root@localhost ~]# ./mybak.sh /boot/grub ##备份到/boot/grub