你的位置:首页 > 操作系统

[操作系统]shell脚本一


    在一些复杂的Linux维护工作中,大量重复的输入和交互操作不但费时费力,容易出错.这时候就需要用到脚本。

  编写脚本的好处:  批量的处理,自动化的完成维护,减轻管理员的负担。

  linux的shell脚本是一种特殊的应用程序,常见的shell解释器有很多种,使用不同的shell时期内部指令:cat /etc/shells 

[root@xiaolyu ~]# cat /etc/shells

/bin/bash是大多数linux中默认的shell解释器。之后的所有脚本的编写都是bash脚本。

 

1.编写第一个Shell脚本

将平时的操作命令顺序的放入到文件中赋予执行权限,一次的执行。

我们来编写第一个脚本first.sh

linux不以后缀名区分文件,为了方便记忆这里我就以.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 脚本名称        不需要执行权限(主要用于生效配置文件)

#建议使用后三种,在生产环境中不要轻易的给文件可执行权限;

2. 脚本中的变量。

变量的定义是:可以存放一个可变的值的空间

可以通过不同的环境进行改变就是一个可以变的值.

默认情况下: 在Linux中可以将每个shell看成不同的执行环境,所以相同的一个变量名称在不同的变量执行环境中的变量值是不同的.

常见的shell变量分类:

自定义变量、环境变量、位置变量、预定义变量

变量的输出

一般使用echo 输出变量   echo $变量名

举例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 $linux

7.2 6.5

直接使用echo 后面跟$调用的变量 如果有多个则空格隔开


举例3:当变量名和后面的字符容易混淆的时候应该使用{}将变量名括起来

[root@xiaolyu ~]# echo system${Linux}

system7.2

[root@xiaolyu ~]# echo ${Linux}system

7.2system


其他的特殊操作

双引号( "  ")

当=号右边赋值出现空格的时候,需要使用双引号将其扩起

[root@xiaolyu ~]# webserver="nginx 1.1"
[root@xiaolyu ~]# echo $webserver
nginx 1.1

#在双引号的范围内还可以引用其他的变量,从而能够将现有的变量赋值给新的变量

 

[root@xiaolyu ~]# Linux=7.2
[root@xiaolyu ~]# system="RHEL$Linux"
[root@xiaolyu ~]# echo $system
RHEL7.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/pwd
coreutils-8.22-15.el7.x86_64
[root@xiaolyu ~]#

#反撇号括起来的范围内必须是可执行的命令。否则将会出现错误

需要注意的是使用反撇号难以在一条命令中实现嵌套命令的操作,这是可以$()来替代反撇号

如果使用反撇号嵌套会出错的!!

[root@xiaolyu ~]# rpm -q `rpm -qf `which pwd``

rpm: no arguments given for query

which-2.20-7.el7.x86_64

package pwd is not installed

建议使用$()的形式嵌套

[root@xuegod63 ~]# rpm -q $(rpm -qf $(which pwd))

coreutils-8.22-15.el7.x86_64

 


read命令

除了上面的赋值之外还可以使用read命令进行赋值,read命令用来提示用户输入信息,从而实现简单的交互式过程(其实我们所输入的命令就是一种交互式的过程)

执行时需要从标准输入设备键盘读取一行,并以空格为分隔符

[root@xiaolyu ~]# read kernel Linux    #同时定义两个变量操作   
4.7.2 7.2       -->手动输入的变量值
[root@xiaolyu ~]# echo $kernel
4.7.2
[root@xiaolyu ~]# echo $Linux
7.2

 

为了交互式更加的形象,提高易用性,加上 -p选项来设置提示信息

 

[root@xiaolyu ~]# read -p "input your password:" passwd    #-p 指定提示信息
input your password:123456              #123456就是$passwd的值
[root@xiaolyu ~]# echo $passwd        #输出变量  
123456

---------------------------------------------------------------------------------------------------------------


以上的操作只是在当前的bash环境下生效,到了其他控制台或者是其他shel就不能生效了 

我们进入当前shell的子shell验证:

 

[root@xiaolyu ~]# echo $Linux   #在当前的shell环境输出变量
7.2
[root@xiaolyu ~]# bash            #切换子shell
[root@xiaolyu ~]# echo $Linux    #在子shell环境输出变量

                                                        #没有输出东西。

[root@xiaolyu ~]#