linux中Shell脚本应用(一)

Shell脚本应用(一)

[重点]

ØShell变量的应用

ØShell脚本的编写和执行

1.1Shell脚本的基础:

Shell是一种特殊的应用程序,介于操作系统内核与用户之间,充当一个“命令解释器”的角色

Shell作用:负责接收用户输入的操作指令(命令)并进行解释,将需要执行的操作传递给内核执行,并输出执行结果

1.1.1Shell脚本:将平时使用的各种linux命令按顺序保存到一个文本文件,然后添加执行权限,这文件便成为一个shell脚本

lShell脚本的内容构成:环境声明、注释文字、执行语句

通过/etc/shells可以了解当前系统所支持的shell种类

/bin/bash是目前linux脚本采用的默认shell

1.1.2重定向与管道符操作

Linux系统使用文件来描述各种硬件、设备资源,如(光盘、硬盘和分区等)

交互式硬件设备:

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

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

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

1)重定向输出:将命令的正常输出结果保存到指定的文件中,而不是直接显示在显示器的屏幕上。使用>>>操作符号,分别表示覆盖或追加文件

覆盖:覆盖原有文件追加:保留目标文件原有内容

列:uname �Cp  > kernel.txt    //将当前主机的CPU类型保存到kernel.txt文件中

  Cat /kernel.txt

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

(结合passwd命令的“- -stdin选项来识别标准输入)

列:vi pass.txt

  123456

  Passwd  - -stdin jerry <  pass.txt

3)错误重定向:将执行命令过程中出现的错误信息(如选项或参数错误等)保存到指定文件,而不是直接显示在屏幕上。使用2>操作符

(其中“2”是错误文件的编号。在使用标准输入、输出时,实际上省略了01编号)

对于shell脚本来说,可以将无关紧要的错误信息重定向到空文件/dev/null

  “2>>”追加错误信息

  “&>”将两类输出信息保存到同一个文件

列:tar jcf/nonedir/etc.tgz  /etc/ 2> error.log

    Caterror.log

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

shell脚本应用中,管道符通常用来过滤所需要的关键信息

awk 命令做进一步过滤�CF 部分用来指定分割符号,未指定时,默认以空格或制表符分隔)

列:grep “/bin/bash$”  /etc/passwd    //提取前

grep  “/bin/bash$/ “ /etc/passwd/ | awk �CF : ‘{print  $1,$7}’  //提取后只输入用户名和登陆shell

:df  -hT

 df  -hT  |grep  “/$”  | awk  ‘{print $5}’    //  提取/分区的磁盘使用率

1.2 使用shell变量

Shell变量用来存放系统和用户需要使用的特定参数(值)

1.2.1自定义变量:有系统用户自己定义的变量,又称为本地变量

1.定义新变量基本格式:“变量名=变量值”,等号两边没有空格

注意:变量名称需要以字母或下划线开头,不要包含特殊字符(如+-*/..?%#等)

列:product=benet  

version=4.0

2.查看和应用变量的值:通常在变量名称前添加$,可以引用一个变量的值

使用echo可以查看变量

列:echo $product

3.变量赋值的特殊操作:在“=”两边直接指定变量内容是为变量赋值的最基本的方法

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

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

u列:benet=benet 4.0

Ø单引号’:赋值的内容中包含$ “ \等具有特殊含义的字符时,应使用单引号括起来

u注:在单引号的范围内,将无法引用其他变流量的值,任何字符将视为普通字符

u当赋值内容包含单引号时,需使用“\’”进行转义,以免冲突

u列:ACCP= ACCP$version

Ø反撇号(`:  主要用于命令替换,允许将执行某个命令的屏幕输出结果赋值给变量

u注:反撇号括起来的范围内必须是能够执行的命令

u列:ls  -lh `which  cd`

u注意:反撇号难以在一行命令中实现嵌套命令替换操作,可以使用 $()来代替反撇号操作,已解决嵌套问题

u列:rpm �Cqc$(rpm �Cqf $(which  useradd))

Ø(4)read命令:给变量赋值,用来提示用户输入信息。结合“-p”选项设置提示信息,以便告知用户输入什么内容等相关信息。

列: read �Cp  “请指定备份存放目录:”  todir2

    Echo  $todir2

4.设置变量的作用范围

默认情况,新定义的变量只在当前shell环境有效,因此称为“局部变量”,当进入子程序或新的子shell环境时,局部变量将无法使用

Export命令将指定的变量导出为“全局变量”,可以同时指定多个变量名作为参数(不许使用$符号)

列: echo $product $version    //查看当前定义的变量值

    Export  product version       //设为全局变量

    Bash    // 进入子shell环境

 Exit    //返回原有shell环境

使用export导出全局变量,也可为变量进行赋值(这样新定义的全局变量就不用提前赋值)

列:export  FQDN=www.jb-aptech.com.cn

   Echo$FQDN

5.数值变量的运算

Shell变量的数值运算多用于脚本程序的过程控制(如需换次数、使用量的比较等)

bash环境中,只能进行简单的整数运算,不支持小数运算

整数值运算主要通过内部命令expr进行,注意运算符与变量之间必须有至少一个空格

基本格式:expr   变量 1 运算符变量2运算符变量3

常用的几种运算符:

l+加法运算

l-:    减法运算

l\*:   乘法运算,注意不能仅使用“*”符号,否则将被当成文件通配符

l/:    除法运算

l%:   求模运算,又称为取余运算,用来计算数值相除后的余数

1.2.2特殊的shell变量

1.环境变量:指的是出于运行需要而由linux系统提前创建的一类变量。主要用于设置用户的工作环境,包括用户宿主目录、命令查找路径、用户当前目录、登陆终端等

环境变量的值有linux系统自行维护,会随着用户状态的改变而改变。

Env命令可以查看到当前工作环境下的环境变量

常见的环境变量及其用途:

lUSER:表示用户名称

lLANG:表示语言和字符集

lHOME:表示用户的宿主目录

lPWD:表示当前所在的工作目录

lPATH:表示命令搜索路径

注:PATH变量用于设置可执行程序的默认搜索路径

列:PATH=”$PATH:/root”    // / root添加到搜索路径

linux系统中,环境变量的全局配置文件为/etc/ profile,在文件定义的变量作用于所有用户

除此以外,每个用户还有自己的独立配置文件(~/.bash_profile

若要长期变更或设置某个环境变量,应在上述文件中设置。

列:vi  /root/.bash_profile

   Export HIATORY=200    //将历时命令条数改为200(默认为1000条)

History | wc �Cl  

2.位置变量:也称位置参数,使用$1$2$3…..$9表示。

列入:当执行命令“ls -lh /boot/”第1个位置变量为“-lh”,以$1表示,第2个位置变量为“/ boot”以$2表示,命令或脚本本身的名称使用$0表示

注意:虽然$0与位置变量的格式相同,但$0属于预定义变量而不是位置变量

3.预定义变量:bash程序预先定义好的一类特殊变量,(用户只能使用预定义变量,但不能创建新的预定义变量,也不能直接为预定义变量赋值)

预定义变量使用:$符号和另一个符号组合表示

常用的几个预定义变量:

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

l$*:表示所有的位置参数的内容

l$?:表示前一条命令执行后的返回状态

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

列:vi mybak.sh

#!/bin/bash

TARFILE=beifen-`date +%s`.tar.tgz

Tar zcvf $TARFILE  $* &> /dev/null

Echo “ 已经执行 $0脚本

Echo “ 共完成  $# 个对象的备份

Echo “ 具体内容包括: $*”

#chmod +x mybak.sh

#./mybak.sh /boot/grub   //备份1个对象的情况

#./mybak.sh   /etc/passwd /etc/shadow   //备份2个对象的情况

Ls �Clh beifen-*      // 确认备份结果





本文出自 “敏而好学” 博客,谢绝转载!

你可能感兴趣的:(linux安全检测,郑彦茹,liunx中shell脚本应用)