shell脚本一

本文发布时间: 2019-Mar-22
在一些复杂的Linux维护工作中,大量重复的输入和交互操作不但费时费力,容易出错.这时候就需要用到脚本。  编写脚本的好处: 批量的处理,自动化的完成维护,减轻管理员的负担。  linux的shell脚本是一种特殊的应用程序,常见的shell解释器有很多种,使用不同的shell时期内部指令:cat /etc/shells[root@xiaolyu ~]# cat /etc/shells/bin/bash是大多数linux中默认的shell解释器。之后的所有脚本的编写都是bash脚本。一、编写第一个Shell脚本将平时的操作命令顺序的放入到文件中赋予执行权限,一次的执行。我们来编写第一个脚本first.shlinux不以后缀名区分文件,为了方便记忆这里我就以.sh为结尾[root@xiaolyu ~]# vim first.sh注释:#!/bin/bash 主要是为了声明,我所写的均为bash语言(我是用的是bash解释器)第二行为注释行,注释信息不生效当写一个比较大的脚本时,如果没有一个好的注释,那么也就也就没有人都能够看懂其中的意思了再往后即执行的命令。执行过程:[root@xiaolyu ~]# ll first.sh #查看是否具有执行权限-rw-r--r--. 1 root root 62 Aug 30 22:58 first.sh [root@xiaolyu ~]# chmod +x first.sh #给脚本添加执行权限[root@xiaolyu ~]# ll first.sh #查看脚本是否具有执行权限-rwxr-xr-x. 1 root root 62 Aug 30 22:58 first.sh[root@xiaolyu ~]# ./first.sh #执行脚本执行的结果:E-执行脚本的不同方式第一种使用绝对路径执行第二种使用相对路径执行,如./的方式第三种使用 sh命令来执行 格式 sh 脚本名 不需要执行权限 -x参数第四种使用 . (空格)脚本名称的方式执行 不需要执行权限 . first.sh第五种使用 source 脚本名称 不需要执行权限(主要用于生效配置文件)#建议使用后三种,在生产环境中不要轻易的给文件可执行权限;二、 脚本中的变量。变量的定义是:可以存放一个可变的值的空间可以通过不同的环境进行改变就是一个可以变的值.默认情况下: 在Linux中可以将每个shell看成不同的执行环境,所以相同的一个变量名称在不同的变量执行环境中的变量值是不同的.常见的shell变量分类:自定义变量、环境变量、位置变量、预定义变量变量的输出一般使用echo 输出变量 echo $变量名1.自定义变量举例1:来进行定义一个变量名字为Linux值为7.2 [root@xiaolyu ~]# Linux=7.2 #为变量Linux赋值[root@xiaolyu ~]# echo $Linux #输出变量Linux的值7.2[root@xiaolyu ~]# linux=6.5 #为变量linux赋值[root@xiaolyu ~]# echo $linux #输出变量linux的值6.5可以直接在命令行定义一个变量并赋予值,通过echo进行输出变量 $是引用变量的特殊字符(必须使用$符号)注意:echo和调用的变量之间必须要有空格。 大小写的变量的值是不同的。举例2:当需要一起调用两组变量时[root@xiaolyu ~]# echo $Linux $linux7.2 6.5直接使用echo 后面跟$调用的变量 如果有多个则空格隔开举例3:当变量名和后面的字符容易混淆的时候应该使用{}将变量名括起来[root@xiaolyu ~]# echo system${Linux}system7.2[root@xiaolyu ~]# echo ${Linux}system7.2system其他的特殊操作双引号( ' ')当=号右边赋值出现空格的时候,需要使用双引号将其扩起[root@xiaolyu ~]# webserver='nginx 1.1'[root@xiaolyu ~]# echo $webservernginx 1.1#在双引号的范围内还可以引用其他的变量,从而能够将现有的变量赋值给新的变量[root@xiaolyu ~]# Linux=7.2[root@xiaolyu ~]# system='RHEL$Linux'[root@xiaolyu ~]# echo $systemRHEL7.2[root@xiaolyu ~]#单引号( ' ') 当要赋值的内容包括'$'、''等,具有其他含义的特殊字符时,应使用单引号将其括起来;在单引号范围内将无法引用其他的值,任何字符均作为普通字符看待,但赋值 的内容包含单引号时需要使用’符号进行转义以免冲突.[root@xiaolyu ~]# kernel=3.10$Linux[root@xiaolyu ~]# echo $kernel 3.107.2 #这个结果不是我们想要的,我们想要的结果是$3.10$Linux[root@xiaolyu ~]# kernel='3.10$Linux'[root@xiaolyu ~]# echo $kernel 3.10$Linux[root@xiaolyu ~]#反撇号( ` `) 位置在键盘esc的下边的按键。反撇号主要使用于命令替换,允许将某个命令的屏幕输出结果赋值给变量。举例: 在命令行中查找程序的详细的信息[root@xiaolyu ~]# rpm -qf `which pwd`coreutils-8.22-15.el7.x86_64[root@xiaolyu ~]# rpm -qf $(which pwd)coreutils-8.22-15.el7.x86_64[root@xiaolyu ~]# which pwd/usr/bin/pwd[root@xiaolyu ~]# rpm -qf /usr/bin/pwdcoreutils-8.22-15.el7.x86_64[root@xiaolyu ~]##反撇号括起来的范围内必须是可执行的命令。否则将会出现错误需要注意的是使用反撇号难以在一条命令中实现嵌套命令的操作,这是可以$()来替代反撇号如果使用反撇号嵌套会出错的!![root@xiaolyu ~]# rpm -q `rpm -qf `which pwd``rpm: no arguments given for querywhich-2.20-7.el7.x86_64package pwd is not installed建议使用$()的形式嵌套[root@xiaolyu ~]# rpm -q $(rpm -qf $(which pwd))coreutils-8.22-15.el7.x86_64read命令除了上面的赋值之外还可以使用read命令进行赋值,read命令用来提示用户输入信息,从而实现简单的交互式过程(其实我们所输入的命令就是一种交互式的过程)执行时需要从标准输入设备键盘读取一行,并以空格为分隔符[root@xiaolyu ~]# read kernel Linux #同时定义两个变量操作 4.7.2 7.2 -->手动输入的变量值[root@xiaolyu ~]# echo $kernel4.7.2[root@xiaolyu ~]# echo $Linux7.2为了交互式更加的形象,提高易用性,加上 -p选项来设置提示信息[root@xiaolyu ~]# read -p 'input your password:' passwd #-p指定提示信息input your password:123456 #123456就是$passwd的值[root@xiaolyu ~]# echo $passwd #输出变量 123456---------------------------------------------------------------------------------------------------------------以上的操作只是在当前的bash环境下生效,到了其他控制台或者是其他shell就不能生效了我们进入当前shell的子shell验证:[root@xiaolyu ~]# echo $Linux #在当前的shell环境输出变量7.2[root@xiaolyu ~]# bash #切换子shell[root@xiaolyu ~]# echo $Linux #在子shell环境输出变量 #没有输出东西。[root@xiaolyu ~]#也可以先定义一个全局变量并赋值:[root@xiaolyu ~]# export website=www.baidu.com #设置全局变量[root@xiaolyu ~]# echo $website #在当前环境输出变量www.baidu.com [root@xiaolyu ~]# bash #进入子shell [root@xiaolyu ~]# echo $website #输出子shell中的变量www.baidu.com[root@xiaolyu ~]#需要注意的是变量的名是严格区分大小写的数值变量的运算:shell脚本的数值运算多用于脚本程序的过程控制(如循环次数,使用量比较等)在shell环境中,只能进行比较简单的整数运算运算符与变量之间必须有一个空各位,整数的运算主要是通过内部命令expr 命令进行运算。格式 变量1 运算符 变量2其中 变量1 、变量2 ……对应的需要计算的数值变量(需要$符号调用)常用的几种运算符如下所示加法运算:+减法运算: -乘法运算: *除法运算: /求模(取余)运算: %若要将运算结果赋值给其他变量可以这么做2. 环境变量  环境变量是指系统本身运行需要由linux系统提前创建好的一类变量。主要用于用户的工作环境,包括(用户的宿主目录,命令的查找路径,用户的当前目录,登录的终端等)环境变量的值由操作系统本身自己维护,随着用户的状态改变而改变env调取当前环境变量环境变量的配置文件在/etc/profile(全局)用户宿主目录/home/berners/.bash_profile(局部) #我非root用户是berners.$PWDpwd命令就是调用了这个变量才能进行输出$PATH定义命令的默认搜索路径,我们讲的mysql可执行程序优化的时候我们是直接将程序路径写到了这个变量中才可以再任何目录下进行输入.$USER就是当前登陆系统的用户$SHELL显示当前所用的shell$HOME显示当前用户的家目录。一般非root用户的家目录都在/home目录下,有个以当前用户命名的目录。root用户家目录在/root下。由/etc/passwd的倒数第二个域决定3.位置变量  当执行命令行操作时,命令行中第一个字段表示命令字或程序名,其余的字符串参数按照从左到右的顺序依次给位置变量赋值 位置变量也称为位置参数,使用$1 $2 $3 …$9表示以ls -lh /boot/为例其中除了 ls 之外的都是位置参数-lh是一个位置参数使用$1表示 依次往后排,(空格分隔)$0属于预定义变量而不是位置变量在下面的例子中我通过编写一个加法运算的脚本来说明位置变量vim positionVariable.sh4.预定义变量$#:命令行中位置变量的个数(程序执行了几个位置参数)$*:所有位置变量的内容(具体的内容 比如/boot就是一个具体的内容)$?:上一条命令执行后返回的状态,当返回状态值为0时表示执行正常,非0值表示执行异常或出错判断是否出现错误正常为0异常错误为非0 取值在1-127之间$0:当前执行的进程/程序名(就是当前执行的命令或程序的名字)下面我通过一个例子来解释vim backup.sh 编译一个使用打包命令打包多个目录或文件


(以上内容不代表本站观点。)
---------------------------------
本网站以及域名有仲裁协议。
本網站以及域名有仲裁協議。

2024-Mar-04 02:08pm
栏目列表