Shell脚本基础

一 Shell脚本简介

实现linux服务器的自动化维护的命令的集合;包括自动安装软件命令集合、自动备份命令集合等

·Shell的作用: 命令解释器,"翻译官";介于系统内核与用户之间,负责解释命令行

·用户的登录Shell:登录后默认使用的Shell程序,一般为 /bin/bash不同Shell的内部指令、运行环境等会有所区别

9.1 Shell脚本基础_语句

·简单的脚本示例

编写脚本代码:使用vi文本编辑器、每行一条Linux命令,按执行顺序依次编写

9.1 Shell脚本基础_管道_02

·脚本的执行

方法一:脚本文件路径

直接输入脚本文件路径后回车,前提是脚本文件要有可执行性权限

9.1 Shell脚本基础_管道_03

赋予可执行权限使脚本具有可执行属性

9.1 Shell脚本基础_shell_04

方法二:sh 脚本文件路径

不要求X权限

9.1 Shell脚本基础_shell_05

方法三:source 脚本文件路径

不要求X权限

9.1 Shell脚本基础_语句_06

·更完善的脚本构成

1脚本声明:表示此行以后的语句通过此处声明的程序来解释执行

2注释信息:以"#"开头的都是注释信息,让脚本更易读

3可执行语句:用于执行的命令

4 echo"内容":用于直接显示"内容",内容中可包含变量;用于友好提示

[root@localhost ~]# vi /first.sh

#!/bin/bash                    //此句以后的语句通过/bin/bash程序来解释执行

# This is my first Shell-Script.        //注释

cd /boot                        //语句

echo "当前的目录位于:"        //友好提示(其中也可以加变量)

pwd

echo "其中以vml开头的文件包括:"

ls -lh vml*

二 重定向与管道操作

·交互式硬件设备

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

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

标准错误:通过该设备报告执行出错信息

9.1 Shell脚本基础_shell脚本_07

·重定向操作

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

重定向输出:将命令的正常输出结果保存到指定的文件中

错误重定向:将执行命令过程中出现的错误信息保存在指定的文件

9.1 Shell脚本基础_语句_08

示例:

重定向输出

9.1 Shell脚本基础_shell_09

重定向输入:编辑p.txt,输入123456,设置root用户密码

9.1 Shell脚本基础_马向军_10

·管道操作符号"|"

将左侧的命令输出结果,作为右侧命令的处理对象

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

使用管道可以方便的提取到需要的内容,即过滤掉没用的

例如:

1只显示用户和登陆shell

过滤前

9.1 Shell脚本基础_管道_11

过滤后:其中awk -F: '{print $1, $7}'表示将每一行的内容用冒号分隔并现实第一部分和第七部分;如果要以空格为分隔,可以去掉—F:

9.1 Shell脚本基础_shell脚本_12

2只显示磁盘使用情况

过滤前

9.1 Shell脚本基础_管道_13

过滤后

9.1 Shell脚本基础_shell_14

三 使用shell变量

·变量的作用:shell变量用来存放系统或用户需要使用的特定参数值,而且这些参数可以根据用户的设定或系统环境的变化而相应的变化

变量名:使用固定的名称,由系统预设或用户定义

变量值:能够根据用户设置、系统环境的变化而变化

·变量的类型

自定义变量:由用户自己定义、修改和使用;只在自己的shell环境中有效,又叫本地变量

1定义新的变量:直接指定变量名并赋予初始值;格式"变量名=变量值";等号两边不能有空格;变量名称只能以字母或下划线开头,不能包含特殊字符;例如

9.1 Shell脚本基础_shell_15

2查看和引用变量的值:在变量名前加$可以引用一个变量的值;使用echo可以查看变量的值;当变量名称与其后的字符容易混淆时,可以用大括号将变量名称括起来,以便区分;未定义的变量显示为空

9.1 Shell脚本基础_shell脚本_16

9.1 Shell脚本基础_马向军_17

3使用引号赋值

双引号:允许通过$符号引用其他变量值,即以变量的值赋值;变量值有空格时不允许赋值,加上双引号后即可

9.1 Shell脚本基础_管道_18

9.1 Shell脚本基础_马向军_19

单引号: 当要赋值的内容包含"$"\"等特殊符号时,可以使用单引号括起来;单引号引用其他变量的值,任何字符均作为普通字符看待;如果赋值内容包含单引号时,使用"\'"进行转义,避免冲突

9.1 Shell脚本基础_马向军_20

反撇号:将执行某个命令的屏幕输出结果赋值给变量;也可以引用其他变量的值;反撇号括起来的内容必须是命令,否则会报错;反撇号位于TAB键的上方

先执行反撇号里面的命令,再将结果交给前一个命令

9.1 Shell脚本基础_shell_21

将命令的结果赋值给变量

9.1 Shell脚本基础_shell脚本_22

或者可以使用"$()"代替反撇号

9.1 Shell脚本基础_马向军_23

4使用read赋值

定义好变量名后手动输入变量值;可以以空格为分界定义多个变量,然后以空格为分界输入多个变量值,如果变量值多余变量名,则多余的变量值赋予最后一个变量名;如果变量名多余变量值,则按顺序后面的变量值为空;加-P可以输入注释,在友好提示用户输入的内容

格式: read [-p "提示信息"] 变量名

回车后手动输入变量值

9.1 Shell脚本基础_shell脚本_24

9.1 Shell脚本基础_语句_25

5设置变量作用范围

默认情况下,新定义的变量只在当前的shell环境中有效,因此称为局部变量;因此当用户进入新的子shell环境时,局部变量将无法再使用;因此就需要设置变量的作用范围

方法一:使用export 变量名;将变量设置为全局变量,如

9.1 Shell脚本基础_马向军_26

方法二:使用export 变量名=变量值;定义变量时直接设置为全局变量

9.1 Shell脚本基础_管道_27

6数值变量的计算(整数)

格式:expr 变量1 运算符 变量2 [运算符 变量3] ...

常用运算符

加法运算:+

减法运算: -

乘法运算: \*

除法运算: /

求模(取余)运算: %

例如

9.1 Shell脚本基础_shell脚本_28

环境变量:由系统维护,用于设置工作环境;系统自带的;使用env命令可以查看当前系统变量

9.1 Shell脚本基础_shell_29

1常见的系统变量有:USER=用户名;HOME=当前用户宿主目录;LANG=语言和字符集;PATH=程序的命令搜索路径

PATH变量:用于设置可执行程序的默认搜索路径,当仅指定文件名称来执行命令时,linux将在PATH变量指定的目录范围查找对应的可执行文件,如果找不到,则提示未发现;如脚本ss.sh在root目录下,不能直接执行,可以加root目录添加到PATH变量中来解决

9.1 Shell脚本基础_shell脚本_30

环境变量的全局配置文件/etc/profile;在此文件中定义的变量作用于所有用户;每个用户可以用字自己的独立的配置文件~/.bash_profile

如针对root用户将历史记录命令条数改为200,默认是1000

9.1 Shell脚本基础_管道_31

添加以下内容

9.1 Shell脚本基础_shell脚本_32

重启后生效(这里没有重启)

9.1 Shell脚本基础_shell脚本_33

位置变量:通过命令行给脚本程序传递参数

位置变量中,第一个字段表示命令名或脚本名,其余的字符串参数按照从左到右依次赋予位置变量;即脚本名后面的参数依次为$1….$9,最多到$9

9.1 Shell脚本基础_管道_34

例如

9.1 Shell脚本基础_shell脚本_35

9.1 Shell脚本基础_马向军_36

预定义变量:Bash中内置的一类变量,不能直接修改;常用的预定义变量有

$#:表示位置参数的个数

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

$?:表示前一条命令执行后的返回状态,为0,则表示正确执行,非0则表示异常

$0:表示当前执行的这个脚本的名称

举例说明

9.1 Shell脚本基础_马向军_37

9.1 Shell脚本基础_马向军_38