~~~~~~~~ 因为想要面对一个新的开始,一个人必须有梦想、有希望、有对未来的憧憬。如果没有这些,就不叫新的开始,而叫逃亡。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ————玛丽亚·杜埃尼亚斯
shell脚本就是将要执行的命令按顺序保存到一个文件中,并给该文件可执行权限,方便一次性执行的一个程序。主要是方便管理员进行设置或管理,可结合各种shell控制语句以完成更复杂的操作。常用于重复性操作、批量事务处理、自动化运维、服务运行状态监控、定时任务执行等。
linux系统中的shell脚本是一个特殊的应用程序,它在操作系统内核和用户之间充当一个“命令解释器”的角色,负责接收用户输入的操作指令并进行解释,将需要执行的操作传递给内核执行,并输出执行结果。
查看系统默认的shell
可以通过/etc/shells文件查看当前系统所支持的shell脚本类型。
1、bash script-name 或 sh script-name 这是当脚本文件本身没有执行权限时常使用的方法
2、path/script-name 或./script-name 在当前路径下执行脚本,需要将脚本文件的权限改为可执行。然后使用脚本的绝对路径或相对路径就可以直接执行脚本了。
3、source script-name 或 . script-name 这种方法通常是使用source或 “.”(点号)读入或加载指定的Shell脚本文件,然后依次执行指定的Shell脚本中的语句。这些语句将在当前父 shell 脚本进程中执行(其他几种模式都会启用新的进程执行该脚本进程)。
一个良好的编程规范将会大大提升开发的效率,并且能够在后期降低对脚本的维护成本。所以脚本的规范变得尤为重要。
一般开头指出哪个解释器来执行脚本中的内容,比如:#!/bin/bash 或 #! /bin/sh sh为bash的软链接。但大多数情况下,更为规范的写法是#!/bin/bash
在shell脚本中,#后面为注释的内容,系统不会执行。仅仅作为开发者的阅读性信息。注释信息尽量不要使用中文,防止乱码的情况。
shell的扩展名为xxx.sh
成对的符号应一次性写胡来,然后在符号中增加内容,防止遗漏。比如:{}、[]、’’、""等。[]两端至少要有1个空格。
流程控制的语句也应该一次性写完,再增添内容,同时注重代码的缩进,让程序更友好易读。
对于常规变量赋值应加双引号"",并且等号前后不能有空格。如果想要文本格式的(不引用命令)应用单引号’’。如果是对命令的引用,应使用反引号``
脚本中的所有符号记住英文状态下书写
由于shell脚本批处理的特殊性,提取信息及过滤信息的操作就变得重要起来。
管道符
管道符为 ‘|’,它的功能是管道左边的命令结果作为右边命令的输入,并且同一行命令可以使用多个管道。在shell脚本中,管道符通常用来过滤所需要的关键信息。比如:
过滤出以bash结尾的用户
awk提取信息
[root@localhost ~]# grep "/bin/bash$" /etc/passwd | awk -F: '{print $1,$7}'
#-F 用来指定分隔符号,为指定时则以空格或制表符分隔
[root@localhost ~]# df -Th |grep "/$" |awk '{print $6}'
在实际的Linux系统维护中,可以改变输入、输出内容的方向,而不使用默认的标准输入、输出设备,这种操作称为”重定向”
标准输入(STDIN):
默认的设备是键盘,文件编号为0,命令将从标准输入文件中读取在执行过程中需要的输入的数据。
#vim pass.txt
#passwd --stdin boy < pass.txt #给用户设置密码
标准输出(STDOUT):
默认的设备是显示器,文件编号为1,命令将执行后的输出结果发送到标准输出文件。
#uname -p >kernel.txt 查看CPU类型
#uname -r >>kernel.txt 查看内核版本信息
标准错误(STDERR):
默认的设备是显示器,文件编号为2,命令执行期间的各种错误信息发送到标准错误文件。
# la 2> error.log
命令的输出结果包括了正常的执行信息和错误信息两类,可使用>和2>分别输出到不同的文件,当然也可以使用&>操作符将两类输出信息保存到同一文件中。比如可以重定向到空文件/dev/null中。
shell变量用于存放系统和用户需要使用的特定参数。常见的shell变量类型包括自定义变量,环境变量,位置变量,预定义变量。
格式:变量名=变量值
注意:等号两边没有空格。变量名称需以字母或下划线开头,名称中不要包含特殊字符(+ - * / . ? % & #)等
引用和查看变量
需要引用时在变量名前加$,用echo可以同时查看多个变量
当变量与参数值混用时需要添加{}以区分开来。
双引号("")
双引号主要起界定字符串的作用,特别是当要赋值的内容包含空格时,必须以双引号括起来。在双引号的范围内,使用$符号可以引用其他变量的值。
单引号(’’)
在单引号的范围内,将无法引用其他变量的值,任何字符都被当做普通字符,即为文本格式。但在赋值内容中包含单引号时,需要使用\进行转义,以免冲突。
反引号(``)
反引号括起来的范围必须使能够执行的命令。如:
在一行命令中查找tar命令程序的位置并列出其详细属性。
# ls -lh `which tar`
使用反引号不能实现嵌套命令替换时,可以使用$()来代替如:
查询提供useradd命令程序的软件包所安装的配置文件位置
# rpm -qc $(rpm -qf $(which useradd))
read命令用来提示用户输入信息,从而实现简单的交互过程。执行时将从标准输入设备读入一行内容,并以空格为分隔符,将读入的各字段挨个赋值给指定的变量(多余的内容赋值给最后一个变量)。若指定的变量只有一个,则将整行内容赋值给此变量。
[root@localhost ~]# read -p "请选择覆盖还是追加yes/no?" -t 3 a
#-p指定提示信息 -t 指定输入等待时间(秒)
默认情况下,新定义的变量只在当前的shell环境中有效,因此称为局部变量。当进入子程序或新的子shell环境时,局部变量将无法再使用。为了使用定义的变量在所有的子shell环境中能够继续使用。可以通过内部命令export将指定的变量导出为全局变量。可以同时指定多个变量名称作为参数(不需要使用$),变量名之间以空格分隔。
#export a b
# bash
# echo "$a $b"
whoam
使用export导出全局变量的同时,也可以为变量进行赋值。
#export a=”i miss you”
# echo $a
i miss you
set 查看定义的变量
unset Serversion 取消变量
readonly 变量名 设置只读变量,unset不能删除只读变量
环境变量
环境变量指的是出于运行需要而由Linux系统提前创建的一类变量,主要用于设置用户的工作环境,包括用户主目录、命令查找路径、用户当前目录、登录终端等。环境变量的值由Linux系统自动维护,随用户状态的改变而改变。使用env命令可以查看到当前工作环境下的环境变量。
PATH变量用于设置可执行程序的默认搜索路径,当仅指定文件名称来执行命令程序时,Linux系统将在PATH变量指定的目录范围查找对应的可执行文件,如果找不到则会提示”command not found”,此时修改PATH变量或将脚本文件复制到环境变量搜索目录下。
如:向PATH环境变量添加脚本文件目录
# echo $PATH
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/root/bin
/root/first.sh
# first.sh
bash: first.sh: 未找到命令...
#PATH=”$PATH:/root”
#first.sh
在Linux系统中,环境变量的全局配置文件为/etc/profile,在此文件中定义的变量作用于所有用户。除此外,每个用户还有自己的独立配置文件(~/.bash_profile)。若要长期变更或设置某个环境变量,应在上述文件中进行设置。
举例:修改历史记录命令条数
# history | wc -l
# vim /root/.bash_profile
export HISTSIZE=50
# source /root/.bash_profile
# history | wc -l
位置变量
为了在使用shell脚本程序时, 方便通过命令行为程序提供操作参数,bash引入了位置变量的概念。当执行命令时,第一个字段表示命令名或脚本程序名,其余的字符串参数按照从左到右的顺序依次赋值给位置变量。
位置变量也称为位置参数,使用$1 $2 $3 …$9表示。
#!/bin/bash
SUM=`expr $1 + $2`
echo "$1+$2"= $SUM
# chmod +x addr2num.sh
# ./addr2num.sh 15 20
15 + 20= 35
set 1 2 3
预定义变量
预定义变量是由bash程序预先定义好的一类特殊变量,用户只能使用预定义变量,而不能创建新的预定义变量,也不能直接为预定义变量赋值。预定义变量使用$符号和另一个符号组合表示,常见的有:
$#:表示命令行中位置参数的个数
$*:表示所有位置参数的内容
$?:表示前一条命令执行后的返回状态,返回值为0表示正确执行,返回值为1表示执行异常
$0:表示当前执行的脚本或程序名称
#!/bin/bash
T=`date "+%Y%m%d-%H%M"`
TARFILE=beifen-${T}.tgz
tar zcf $TARFILE $* &>/dev/null
echo "已执行$0脚本"
echo "共完成$#个对象的备份"
echo "具体内容包括:$*"
# ./mybak.sh /boot/grub /mnt/public /root/aa
已执行./mybak.sh脚本
共完成1个对象的备份
具体内容包括:/boot/grub
相关文章:
shell脚本编程循环语句
shell编程之条件判断语句
shell脚本编程之case语句
shell脚本中的函数及调试