Shell脚本应用(1

Shell:是一个特殊的应用程序,它介于操作系统内核与用户之间,充当了一个“命令解释器”的角色,负责接收用户的操作指令(命令)并进行解释,将需要执行的操作传递给内核执行,并输出执行结果

常见的shell解释器程序有很多,使用不同的shell时,其内部指令,命令行提示等方面会存在一些差别,我们通过cat /etc/shells文件,现在来查看一下

075834698.png

这些都是当前系统中的shell种类。其中/bin/bash是目前大多数linux版本采用的默认shellBash的全称为Bourne Again Shell。是最受欢迎的开源软件项目之一。

创建一个shell脚本,大致分为以下三步

1.理清任务过程

2.整理执行语句

3.完善任务结构

下面我们举个例子,来使用shell脚本创建一个用户

075834312.png//脚本名称

075834332.png

//现在就写完了,这是一个简单的创建用户的脚本。

 

 

下面执行脚本的方式:(三种)

1./useradd.sh//直接打开 ----(因为我们刚创建的脚本,是没有执行权限的,在执行之前,需要给这个脚本一个执行权限。Chmod +x useradd.shchmod +x 相当于 chmod a+x

2.sh useradd.sh . useradd.sh//不需要为脚本添加执行权限

3.source useradd.sh//这种跟上面两种不一样。例如,我们在脚本中写了:

#/bin/bash

cd /home

ll –lh

那么。使用source useradd.sh。执行这个脚本的时候,就真的会进入 home路径下,而不是在当前目录

重定向操作

标准输入(stdin)。默认的设备是键盘。文件编号为0,命令将从标准输入文件中读取在执行过程中的数据。

标准输出(stdout):默认的设备是显示器,文件编号为1,命令将执行后的输出结果发送到标准输出文件

标准错误(stdout):默认的设备是显示器,文件编号为2,命令将执行期间的各种错误信息发送到标准错误文件

1)重定向输出:重定向输出指的是将命令的正常输出结果保存到指定的文件中,而不是直接显示在显示器的屏幕

包括:>>>,分别用户覆盖和追加文件。若重定向输出的目标文件不存在,则会新建该文件,然后将前面命令的输出结果保存到该文件中

例如

075834419.png

若需要保留源文件的内容。需要使用>>

2)重定向输入:重定向输入指的是将命令中接收输入的途径由默认的键盘改为指定的文件,而不是等待从键盘输入

使用 < 符号

例如

075835947.png

第一个是将“123456“输入到passwd.txt文件中。

然后更改user1的密码。从passwd.txt文件中提取

3)错误重定向:错误重定向指的是将执行命令过程中出现的错误信息(如选项或参数错误等)保存到指定的文件,而不是直接显示在屏幕上。错误重定向使用2> 操作符,其中2是错误文件的编号(在使用标准输出,标准输入时,实际上省略了0.1编号)

例如

075835246.png

不会将错误信息输出到屏幕,而是保存到error.txt文件中

使用2>> 也是不覆盖源文件,在末尾追加。

使用shell变量。

常见的shell变量的类型包括自定义变量,环境变量,预定义变量,位置变量

1.自定义变量

自定义变量是由系统用户自己定义的变量,只在用户自己的shell环境中有效,因此成为本地变量。

基本格式为:变量名=变量值。等号两边没有空格、变量名称需要以字母或下划线开头,名称中不要包含特殊字符(如+ - * / . ? % $ # &等)

例如

075835700.png

2.查看和引用变量的值

通过在变量名称前添加$,可以引用一个变量的值,使用echo命令可以查看变量。可以在一条echo命令中同时查看多个变量值。

例:

075835340.png

当变量名称容易和紧跟其后的其他字符相混淆时,需要添加大括号{}将其包起来,否则将无法确定正确的变量名称,对于未定义的变量,将显示空值。

例如

075835489.png

3,变量赋值的特殊操作。

在等号“=”后边直接指定变量内容是为变量赋值的基本方法,除此以外,还有一些特殊的赋值操作

1)双引号“”

双引号主要起一个界定字符串的作用,特别是当要赋值的内容中包含空格时,必须以双引号括起来,其他情况下可以省略

例如:

080746685.png

在双引号范围内,使用$符号可以引用其他变量的值(变量引用),从而能够直接调用现有变量的值来赋值给新的变量。

例如

075836353.png

2)单引号‘’

当要赋值的内容中包括$,” /等具有特殊含义的字符时,应使用单引号括起来。在单引号的范围内,将无法引用其他变量的值,任何字符均作为普通字符看待,但赋值内容中包含单引号时,需要使用“\”符号进行转义,以免冲突

075836368.png

3)反撇号

反撇号主要用于命令替换,允许将执行某个命令的屏幕输出结果赋值给变量,反撇号括起来的范围内必须是能够执行的命令行,否则将会出错、

连续执行了两条命令---先通过which useradd 命令查找useradd命令的程序位置,然后根据查找结果列出文件属性,执行过程中,会将which useradd 命令的输出结果替换整个反撇号范围

075837814.png

可以给命令赋值

uname –r的输出结果给aa

075837206.png

4read命令

除了上述赋值以外,还可以使用Bash的内置命令read来给变量赋值,read命令用来提示用户输入信息,从而实现简单的交互过程,执行时将从标注输入设备(键盘)读入一行内容,并以空格为分隔符,将读入的各字段挨个赋值给指定的变量(多余的内容赋值给最后一个变量)。若指定的变量只有一个,则将整行内容赋值给此变量。

例如

075837869.png

为了使交互式操作的界面更加友好,提高易用性,read命令可以结合“-p”选项来设置提示信息,以便告知用户应该输入什么内容等相关事项。

例如

075837798.png

4.设置变量的作用范围

默认情况下,新定义的变量只在当前的shell环境中有效,因此称为局部变量,当进入子程序或新的子shell环境时,局部变量将无法使用。当进入一个新的子shell环境中,将无法引用父级shell环境中定义的nian变量

例如

075837109.png

为了使用户定义的变量在所有的子shell环境中能够继续使用,减少重复设置工作,可以通过内部命令export将指定的变量导出为“全局变量”可以同时制定多个变量名作为参数(不需使用$符号)变量名之间用空格分隔

075838981.png

在使用export导出全局变量的同时,也可以为变量进行赋值,这样在新定义全局变量时就不需要提前进行赋值了。

例如

075838180.png

5.数值变量的运算

整数运算操作

使用expr命令,计算表达式

格式:expr 变量运算符变量2

运算符:+ - \* / %

例:expr 1 + 1注意:在算乘法*的时候,需要转义一下例:expr 1\*2(因为*表示通配符)

若要将运算结果赋值给其他变量,可以结合命令替换操作(使用反撇号)例如,计算变量Y3次方,并将结果赋值给变量aa

075838428.png

使用$[]表达式,算式替换

echo $[1+1]

2

echo $[1-1]

0

echo $[1*2] (算乘法的时候,不用再加\

2

echo $[1/2]

0.5

echo $[1%2]

x=1;y=2

echo [y-x]

 

特殊的shell变量

1环境变量

环境变量指的是出于运行需要而由linux系统提前创建的一类变量、

使用env可以查看到当前工作环境下的环境变量

例如

075839187.png

USER:用户名称

HOME:用户宿主目录

LANG:语言和字符集

PWD:当前所在的工作目录

PATH:命令搜索路径

PATH变量用于设置可执行程序的默认搜索路径,当仅指定文件名称来执行命令程序时,linux系统将在PATH变量指定目录范围查找对应的可执行文件,如果找不到则会提示“command not found”例如,firsh.sh脚本位于/root/目录下,若希望直接通过文件名称来运行脚本,可以修改PATH变量以添加搜索路径,或者将firsh.sh复制到现有搜索路径中的某个文件夹下

当有了root路径,直接执行即可

075839371.png

linux系统中,环境变量的全局配置文件为/etc/profile。在此文件中定义的变量作用于所有用户,除此以外,每个用户还有自己的独立配置文件(~/.bash_profile

历史命令保存的条数是1000

更改为200

打开环境变量文件

075839249.png

找到 HISSIZE

075839498.png

改为200即可

075839729.png

2.位置变量。

位置变量也称为位置参数,使用$1~$9表示。

下面编写一个小脚本,来说明一下

075840826.png

1个位置变量是1,用$1表示。第2个是2,用$2表示

075840298.png

3.预定义变量

预定义变量是由Bash程序预先定义好的一类特殊变量,用户只能使用预定义变量,而不能创建新的预定义变量,也不能直接为预定义变量赋值。较常用的几个预定义变量如下:

由系统或脚本操作,不可直接赋值

075840952.png

$?:前一条命令的状态,0表示正常,非0表示不正常

$0:脚本自身的程序名

$1~$9:第1-9个位置参数

$*:命令行的所有位置参数

$#:命令行的位置参数个数

为了说明预定义变量的作用,下面编写一个备份操作的小脚本,用来打包命令行指定的多个文件和或目录,并输出详细信息。其中,新建的压缩包文件名称嵌入秒刻(从197011日至今经过的秒数)通过date +%s获取

081325944.png

执行一下:

081327984.png

 

请看下节shell脚本应用(2)