一、 shell脚本的概念

   将平时使用的各种Linux命令按顺序保存(堆叠)到一个文本文件中,添加上执行权限,就是一个Shell脚本。

l  将要执行的命令按先后顺序保存到一个文本文件

l  给该文件可执行权限,便可运行

l  可结合各种Shell控制语句以完成更复杂的操作

二、 shell脚本应用场景

重复性操作

批量事务处理

自动化运维

服务运行状态监控

定时任务执行

减轻管理员负担

规避费时操作

三、Shell的概念

       Shell是一个特殊的应用程序,介于操作系统内核和用户之间,充当一个“命令解释器”(翻译官)的角色,负责接受用户输入的指令并进行解释,将需要执行的操作传递给内核执行,并输出执行结果返回给用户。

四、编写Shell脚本的格式:

1、#!/bin/bash        表示脚本通过以/bin/bash程序来编写

#!/bin/bash

2、# 表示注释信息,例如:对编写的脚本作用进行解释,每写一段脚本之前都应该用“#”来注释以下命令执行的结果

# Description:Install Httpd Server

# By:Crushlinux

# Date:2016-01-08

# Version:V1

3、定义脚本中的变量

httpd_software=$(ls tools | grep httpd)

httpd_version=$(ls tools | grep httpd |sed 's/\.tar.*//')

4、定义脚本中的函数

5、脚本执行语句(判断、循环、选择等语句)

if rpm -q httpd &> /dev/null

        then

                rpm -e httpd --nodeps &> /dev/null

                if [ $? -ne 0 ]

                then

                        echo "remove httpd rpm packages failed"

                fi

        fi

6、利用 echo 定义输出一些让人更容易看懂得信息(可以是中文也可以是英文)

echo "#################  操作已完成可去检测 #################"

五、执行脚本的三种方法:

l  通过绝对路径执行:/root/first.sh或进入到脚本文件所在目录 ./first.sh (需要给脚本文件添加上执行权限)

l  相对路径

绝对路径与相对路径实行shell 脚本时,该脚本文件必须具有可执行权限。

 

l  进入到脚本文件所在目录执行 sh first.sh  bash first.sh(文件可以没有执行权限)

sh 脚本路径 (与 “bash脚本路径”相同)

l  进入到脚本文件所在目录执行 source first.sh 或 .  first.sh  (文件可以没有执行权限)

source  脚本路径 (与 “. 脚本路径”相同)

六、脚本后缀名为:

l  .sh  表示编写程序为bash

l  .pl  表示编写程序为perl

l  .py  表示编写程序为python

 

学习shell的方法查看/etc/init.d/ 下的服务控制脚本

七、管道操作

 管道符 |

格式:cmd1  |  cmd2  [... | cmdn]

作用:将管道前的命令输出结果作为管道后命令的参数使用

十、重定向操作

交互式硬件设备文件: standard ( input、output、error)

l  标准输入:从该设备接收用户输入的数据

l  标准输出:通过该设备向用户输出数据

l  错误输出:通过该设备报告执行出错信息

 

 

类型

设备文件

文件描述编号

默认设备

标准输入

/dev/stdin

0

键盘

标准输出

/dev/stdout

1

显示器

标准错误输出

/dev/stderr

2

显示器

 

重定向操作

类型

操作符

用途

重定向输入

< 

从指定的文件读取数据,而不是从键盘输入

重定向输出

> 

将输出结果保存到指定的文件(覆盖原有内容)

>> 

将输出结果追加到指定的文件

标准错误输出

2>

将错误信息保存到指定的文件(覆盖原有内容)

2>>

将错误信息追加到指定的文件中

混合输出

&>

将标准输出、标准错误的内容保存到同一个文件中

 

重定向输入符   <   通过文件输入内容,而不是用标准的键盘输入

[root@localhost ~]# useradd crushlinux

[root@localhost ~]# vim pass.txt

123456

[root@localhost ~]# passwd --stdin crushlinux < pass.txt

更改用户 crushlinux 的密码 。

passwd:所有的身份验证令牌已经成功更新。

 

 

 

“>”覆盖全部内容

“>>”追加文本内容后面

注意:

标准输出,标准输入默认省略了 0 和 1

/dev/null 空文件 黑洞

 

处理多行输出:

[root@localhost ~]# cat  << EOF > test.repo

[c7-media]

name=CentOS-Media

baseurl=file:///media/cdrom

gpgcheck=1

enabled=1

gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

EOF

 

八、变量

1、常量:固定的字符串,含义也是固定的。

       Shell 变量用来存放系统和用户需要使用的特定参数(值),而且参数根据用户的设定或系统环境的改变而相应的改变,灵活,适应性更强。

变量类型:

2、(1)自定义变量

自定义变量是由用户自己定义的变量,只在用户自己的Shell环境中生效,又称本地变量

 

定义格式:变量名=变量值等号两边没有空格

变量名必须使用英文字母或是下划线开头,变量名内不允许出现特殊字符,并且区分字母大小写。

 

使用echo可以查看定义的变量值,$后面是一个变量名

九、特殊符号:

1、双引号(“”):可以引用一个变量,有空格的值。

[root@localhost ~]# echo "$product $version"

cloud 2.0

 

2、单引号(‘’):引号内的内容被视为一个完整的字符串,不能引用变量。

[root@localhost ~]# echo '$product $version'

$product $version

 

3、反撇号(``):引号内的执行结果作为变量名的变量值,引用命令使用。反撇号在一行命中不能实现嵌套命令替换操作,所以使用$()

[root@localhost ~]# rpm -qf `which mkdir`

coreutils-8.22-21.el7.x86_64

[root@localhost ~]# rpm -qf $(which mkdir)

coreutils-8.22-21.el7.x86_64

 

read命令:

       用来提示用户输入信息,从而实现简单的交互变量设置。将用户输入的信息作为变量值,用户的输入以空格作为分隔符,将读入的各个字段挨个赋值给指定的变量,多余的赋值给最后一个变量。

-p  设置提示信息

 

[root@localhost ~]# read -p "please input your name and age: " name age

please input your name and age: zhangsan 20

[root@localhost ~]# echo $name

zhangsan

[root@localhost ~]# echo $age

20

 

设置变量生效范围:

新定义的变量只能在当前Shell环境中生效。又称局部变量

export 命令:可以将局部变量发布到全局。

[root@localhost ~]# echo $product  #查看当前shell中变量的值

cloud

[root@localhost ~]# bash    #切换到新的子Shell环境

[root@localhost ~]# echo $product  #查看变量  (可以看到查不到变量值)

 

[root@localhost ~]# exit                        #退出Shell环境

exit

[root@localhost ~]# export product          #使用export命令将变量发布到全局

[root@localhost ~]# bash                      #进入到一个新Shell环境

[root@localhost ~]# echo $product  #查看变量值

cloud

 

或者可以在定义变量同时声明

[root@localhost ~]# export key=vlaue

 

注意:export全局发布,只能向下面的子Shell发布,不能向上父Shell发布。

 

数值变量的运算:

使用expr命令进行简单的整数运算,不支持小数运算。

[root@localhost ~]# X=12

[root@localhost ~]# Y=22

[root@localhost ~]# expr $X + $Y

34

[root@localhost ~]# expr $X - $Y

-10

[root@localhost ~]# expr $X \* $Y

264

[root@localhost ~]# expr $X / $Y

0

 

其他运算方式:

[root@localhost ~]# echo $((100-33))

67

[root@localhost ~]# echo $[100-33]

67

[root@localhost ~]# echo "scale=2; 100+33" | bc

133

 

十、特殊的Shell变量

1、环境变量:

env 命令查看环境变量

环境变量是指,出于运行需要而由Linux系统提前创建的一类变量,主要用于设置用户的工作环境。

l  /etc/profile : 环境变量的全局配置文件,文件中定义的变量作用于所有用户。

l  .bash_profile :每个用户自己的独立配置文件。

 

常用的环境变量:

HOSTNAME=localhost.localdomain        #定义主机名

PWD=/root      #定义当前所在位置

USER=root      #定义登录用户

……

 

set,env和export这三个命令的区别:

env 显示用户的环境变量;

set  显示当前shell的自定义变量,包括用户的环境变量,按变量名称排序;

export  显示当前导出成用户变量的shell变量,并显示变量的属性(是否只读),按变量名称排序;

declare 同set 一样,显示当前shell的定义的变量,包括用户的环境变量;

unset  取消变量

 

2、位置变量:

位置变量也称为位置参数,使用$1、$2、……、$9、${10}...表示

 

[root@localhost ~]# vim adder2num.sh

#!/bin/bash

SUM=`expr $1 + $2`

echo "$1 + $2 = $SUM"

[root@localhost ~]# ./adder2num.sh 12 34

12 + 34 = 46

 

[root@localhost ~]# vim test.sh

#!/bin/bash

echo "当前的位置变量是:$1"

echo "当前的位置变量是:$2"

echo "当前的位置变量是:$3"

echo "当前的位置变量是:$4"

 

3、预定义变量:

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

         $*、$@           表示所有位置参数的内容($*把所有参数视为整体,$@单个参数的组合)

         $0                   表示当前执行的脚本或程序的名称

         $?                   表示前一条命令执行后的返回状态,返回值为0表示执行正确,非0值为执行错误。

         $#                   表示命令行中位置参数的个数

 

常用的预定义变量:

$#         表示命令行中位置参数的个数