shell脚本的基础

一:什么是shell脚本

Shell脚本就是将要执行的命令按顺序保存到一个文本文件,并给该文件可执行权限,方便一次性(或多次)执行的一个程序文件。

例如:按照最简单顺序创建一个shell脚本

我要在/ 目录下创建一个名叫aa的目录,并且把/mnt目录复制到/aa目录中成为/aa的子目录

vi mkdir.sh

#!/bin/bash

#创建名为aa的目录

mkdir /aa

cp -r /mnt /aa

保存退出,脚本编写完毕。

用命令bash运行脚本,在查看结果

 新人学习:shell脚本第一课(希望各位大大多多指点)_重定向

二:shell脚本格式

根据上面的脚本我们可以看到,Shell脚本的命令是按照顺序执行的。并且开头有特定的格式,SHELL脚本的第一行以 #! ,后面的路径名称是命令解释器#!/bin/bash 作用:告诉脚本使用的是哪种命令解释器,此行以后的语句通过/bin/bash程序来解释执行。

在shell中以#开始头表示整个行就被当作一个注释。执行时被忽略。第二行的#后面可以加上你这个脚本的作用,提高可读性。脚本文件名称的结尾一般都使用.sh结尾方便他人自己看到就知道它是脚本文件。

 

三:脚本执行方式

1:通过命令解释器执行脚本:bash mkdir.sh 或 sh mkdir.sh 当脚本文件本身没有可执行权限(即文件权限属性x位为-号)时常使用的方法,或者脚本文件开头没有指定解释器时需要使用的方法

2:路径下执行脚本

这种方法执行脚本需要为脚本增加可执行权限(x),具体方法chmod +x /root/mkdir.sh(后面写脚本的绝对路径)这时执行脚本时,直接用绝对路径或者相对路径即可执行。

例如:

 新人学习:shell脚本第一课(希望各位大大多多指点)_错误信息_02

3通过命令source或者.执行脚本(.  mkdir.sh),source或者.命令的功能是:读入脚本并执行脚本,即在当前Shell中执行source或“.”加载并执行的相关脚本文件的命令及语句,而不是产生一个子Shell来执行文件中的命令。(简单点理解就是都是在张三的一个口袋里面不会跑到其它口袋运行)该命令也可不用加执行权限也可执行。

四:创建shell脚本的步骤

1:写脚本

2:检测语法错误

3:添加执行权限

4:执行

 

以上就是脚本的基本概念,下面在介绍脚本内部如何编写。

一:管道与重定向

1、管道操作

管道操作为不同命令之间的协同工作提供了一种机制,位于管道符号“|”左侧的命令输出的结果,将作为右侧命令的输入(处理对象)。同一行命令中可以使用多个管道,使用格式如下所示:

cmd1命令|cmd2命令[…|cmdn命令]

例1:#grep  -v  “^#” /etc/sshd_config | grep -v “^$”

例2:若要提取根分区(/)的磁盘使用率信息,可以执行以下操作,其中用到了df、grep、awk命令和管道操作

提取前:

新人学习:shell脚本第一课(希望各位大大多多指点)_shell脚本_03

 

提取后:其中grep “/$”表示提取以“/”结尾的行。awk命令的作用是以空格作为分隔,输出第6个区域的信息。

新人学习:shell脚本第一课(希望各位大大多多指点)_重定向_04

 

2:重定向操作

标准输入(STDIN:默认的设备是键盘,文件编号为0,命令将从标准输入中读取在执行过程中需要的输入数据。例如通过passwd设置用户密码操作

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

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

在实际的Linux系统维护中,可以改变输入、输出内容的方向,而不是用默认的标准输入、输出设备(键盘和显示器),这种操作称为“重定向”。

(1)重定向输入

重定向输入指的是将命令中接收输入的途径由默认的键盘改为指定的文件,而不是等待从键盘输入。重定向输入使用“<”操作符。

 

例如:创建完新用户对其使用passwd命令设置密码时,每次都会提示输入俩编密码。这样比较繁琐。若改用重定向输入将可以省略交互式的过程,而自动完成密码设置(结合passwd命令的—stdin选项来识别标准输入)。

新人学习:shell脚本第一课(希望各位大大多多指点)_bash_05

 

没有交互式的操作,语句更方便在shell脚本程序中使用,可以大大减少程序被打断的过程,提供脚本执行的效率。

(2)重定向输出

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

重定向输出使用“>”或“>>”操作符号,分别用于将前面的命令的输出结果保存到该文件中;若目标文件已存在,则将输出结果覆盖或追加到文件中。

“>”:覆盖

“>>”:追加

例如:将当前主机的CPU信息(uname  -p)保存到1.txt文件中,而不是直接显示在屏幕上,可以执行以下操作。

 新人学习:shell脚本第一课(希望各位大大多多指点)_bash_06

 

注意:> 后面的文件不用你自己去创建,当你使用重定向时它会自动创建一个文件。

当需要保留目标文件原有的内容时,应该为“>>”操作符,以便追加内容而不是覆盖。

例如以下操作可以将内核版本信息追加到1.txt文件中。

新人学习:shell脚本第一课(希望各位大大多多指点)_重定向_07

 在原有的基础追加新的内容

(3)错误重定向

错误重定向指的是将执行命令过程中出现的错误信息保存到指定的文件,而不是直接显示在屏幕上。

错误重定向使用“2>”或“2>>”操作符,其中2是指错误文件的编号(在使用标准输出、输入重定向时,实际上是省略了1、0编号)。

在实际应用中,错误重定向可用来收集程序执行的错误信息,为排错提供依据,对于shell脚本,还可以将无关紧要的错误信息重定向到空文件/dev/null中,以保持脚本输出的简洁。

例如:执行以下操作可以将使用tar命令进行备份时出现的错误信息保存到2.txt文件中。

 新人学习:shell脚本第一课(希望各位大大多多指点)_shell脚本_08

当命令输出的结果可能既包括标准输出(正常执行)信息,又包括错误输出信息时,&符号可以代表不管是正确的还是是错误的意思。

例如:

 新人学习:shell脚本第一课(希望各位大大多多指点)_shell脚本_09

&>   &>>  覆盖和追加都可以使用。