Shell脚本应用(一)
随着Linux系统在企业中的应用越来越多,服务器的自动化管理也变得越来越重要。在Linux服务器的自动化维护工作中,除了计划任务的设置以外,Shell脚本的应用也是非常重要的一部分。作为Linux系统运维工程师,必须得要掌握Shell脚本的基本知识和编写及使用。
shell脚本基础在一些复杂的Linux维护工作中,大量重复性的输入和交互操作不仅费时费力,而且容易出错,而编写一个恰到好处的Shell脚本程序,可以批量处理、自动化地完成一些列维护任务,大大减轻管理员的负担。 一、编制shell脚本Linux系统中的Shell脚本是一个特殊的应用程序,它介于操作系统内核与用户之间,充当了一个“翻译官”的角色,负责接收用户输入的操作指令并进行解释,将需要执行的操作传递给内核执行,并输出执行结果。如图: Linux系统中常见的shell解释程序有很多种,使用不同的shell脚本时,其内部指令、命令提示灯方面会存在一些区别。 [[email?protected] ~]# cat /etc/shells //查看当前系统支持哪些shell * /bin/sh * /bin/bash * /sbin/nologin * /usr/bin/sh * /usr/bin/bash * /usr/sbin/nologin * /bin/tcsh * /bin/csh [[email?protected] ~]# /bin/sh //切换shell sh-4.2# exit //返回上一层shell [[email?protected] ~]# shell脚本:简单来说就是把在命令行执行的命令按顺序存放在一个文本文件中,赋予其可执行权限。那么这个文本文件就可称为一个脚本。比如: [[email?protected] ~]# cd / [[email?protected] /]# pwd / //这是两条命命输出的结果 [[email?protected] ~]# vim a.sh //编写为本文件,以“.sh”结尾只是为了让别人知道这是一个脚本。 cd / pwd [[email?protected] ~]# chmod +x a.sh //服务文本文件可执行的权限 [[email?protected] ~]# ./a.sh / //查看脚本的执行结果和命令行执行的结果是一样 执行脚本的方法:
二、重定向与管道操作由于shell脚本的“批量处理”的特殊性,其大部分操作过程以静默的方式运行,不需要用户干预。因此学会提取、过滤执行信息变得十分重要。 1.重定向操作用户通过操作系统处理信息的过程中,包括三类交互设备文件: 标准输入:从该设备接收用户输入的数据; 标准输出:通过该设备向用户输出数据; 标准错误:通过该设备报告执行出错信息。 重定向的类型分为: 2.管道操作管道符的作用就是将左侧的命令输出结果,作为右侧命令的处理对象。比如: [[email?protected] ~]# df -hT | grep "/$" | awk ‘{print $6}‘ 26% //提取根分区(/)的磁盘使用率信息 三、shell变量各种Shell环境中都使用到了“变量”的概念。Shell变量用来存放系统和用户需要使用的特定参数(值),而且这些参数可以根据用户的设定或系统环境的变化而相应变化。通过适当地使用变量,Shell程序能够提供更加灵活的功能,适应性更强。 Linux系统下常见的四种变量:1.自定义变量自定义变量是由系统用户自己定义的变量吗,只在用户自己的Shell环境中有效,因此,也有人称为本地变量。在编写Shell脚本程序是,用户通常会设定一些特定的自定义变量,以适应程序执行过程中各种变化,以满足不同的需求。 1)定义新的变量 [[email?protected] ~]# product=php [[email?protected] ~]# version=7.3.1 2)查看和引用变量 [[email?protected] ~]# echo $product php [[email?protected] ~]# echo $product $version php 7.3.1 当变量名称容易和紧跟其后的其他字符相互混淆时,需要使用“{}”将变量括起来,否则将报错。比如: [[email?protected] ~]# echo $product1234 //没有找到“product1234”这个变量 [[email?protected] ~]# echo ${product}1234 //正确输出变量和字符 php1234 3)变量赋值的特殊操作 1.双引号(" "):双引号主要起界定字符串的作用,特别是当要复制的内容中包含空格是,必须以双引号括起来,其他情况双引号可以省略。比如: [[email?protected] ~]# Python=python 2.3.7 bash: 2.3.7: 未找到命令... [[email?protected] ~]# python="python 2.3.7" [[email?protected] ~]# echo $python python 2.3.7 双引号还允许通过$符号引用其他变量值,比如: [[email?protected] ~]# SQL="SQLServer $version" [[email?protected] ~]# echo $SQL SQLServer 1.2.3 2.单引号(‘ ‘):禁止引用其他变量值,$视为普通字符,单引号中的特殊符号都将视为普通字符,比如: [[email?protected] ~]# SQLServer=‘SQLserver $version‘ [[email?protected] ~]# echo $SQLServer SQLserver $version 3.反撇号( [[email?protected] ~]# ls -lh `which systemctl` -rwxr-xr-x. 1 root root 623K 11月 7 2016 /usr/bin/systemctl 注意:使用反撇号难以子啊一行命令中实现嵌套命令替换操作,这时可以使用“$()”来替代反撇号操作,解决嵌套问题。比如: [[email?protected] ~]# rpm -qc $(rpm -qf $(which useradd)) /etc/default/useradd /etc/login.defs //查询提供useradd命令程序的软件包所安装的配置文件位置 4.大括号({}):用来分割变量和字符;如果在变量后还有其他字符,就需要使用“{}”,{}中是变量。 4)read命令 read命令可以使从键盘输入的内容为变量赋值,比如: [[email?protected] ~]# read abc /opt/backup //输入给变量abc所赋的值 [[email?protected] ~]# echo $abc /opt/backup //查看结果 为了使交互式操作的界面更加友好,提高易用性,read命令可以加“-p”选项来设置提示信息,以便告知用户应该输入什么内容等。比如: [[email?protected] ~]# read -p "请指定存放的目录:" abcd 请指定存放的目录:/opt/backup [[email?protected] ~]# echo $abcd /opt/backup 5)设置变量的作用范围 [[email?protected] ~]# echo "$SQL $version" SQLServer 1.2.3 1.2.3 [[email?protected] ~]# /bin/sh //切换一个Shell环境 sh-4.2# echo "$SQL $version" //找不到这样的变量 sh-4.2# exit //返回上一个Shell [[email?protected] ~]# 为了使用户定义的变量可以在所有Shell环境中继续使用,减少重复的工作,可以通过内部命令export将指定的变量导出为全局变量。用户可以同时指定多个变量名称作为参数(无需使用“$”符),变量之间用空格分割即可! [[email?protected] ~]# export SQL version [[email?protected] ~]# /bin/sh sh-4.2# echo "$SQL $version" SQLServer 1.2.3 1.2.3 //测试成功 6)数值变量的运算
比如: [[email?protected] ~]# x=35 [[email?protected] ~]# y=16 [[email?protected] ~]# expr $x + $y 51 [[email?protected] ~]# expr $x - $y 19 [[email?protected] ~]# expr $x * $y 560 [[email?protected] ~]# expr $x / $y 2 //只取整数 [[email?protected] ~]# expr $x % $y 3 2.环境变量环境变量指的处于运行需要由Linux系统提前创建好的一类变量。环境变量的值由Linux系统自动维护,会随着用户状态的改变而改变。 3.位置变量当执行命令行操作时,第一个字段表示命令字或脚本程序名,其余的字符串按照从左到右的顺序依次赋值给位置变量。 [[email?protected] ~]# vim 123.sh #!/bin/bash //声明使用何种Shell SUM=`expr $1 + $2` echo "$1 + $2=$SUM" [[email?protected] ~]# chmod +x 123.sh [[email?protected] ~]# ./123.sh 12 34 //$1为12、$2为34时 12 + 34=46 4.预定义变量预定义变量是由Bash程序预先定义好的一类特殊变量,用户不可修改,预定义变量的格式:
建议写在脚本中的命令,应先在命令行,执行完成确认结果之后,再写入脚本中。第一次编写脚本,可能会麻烦一些,当脚本编写完成之后,以后再有类似的需求,直接运行脚本即可! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |