Shell脚本基础

1.shell脚本的概念

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

    给该文件可执行权限

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

2.shell脚本应用场景

    重复性操作

    交互性任务

    批量事务处理

    服务运行状态监控

    定时任务执行

    .....

3.shell的作用

    命令解释器,“翻译官”

    介于系统内核与用户之间,负责解释命令行

    用户登录后默认使用的shell程序,一般为 /bin/bash

    不同shell的内部指令,运行环境等会有所区别

    通过/etc/shells 文件可以了解当前系统所支持的 Shell 脚本种类

查看当前的系统支持的shell

               bash:基于gun的框架下发展的shell

               csh:类似c语言的shell

               tcsh:整合了csh提供了更多功能

               sh:已经被bash替换

               nologin:让用户无法登录

4.shell脚本的构成

   ① 解释器   (脚本是用什么语言写的)

       第一行开头  #!/bin/bash    表示此行以下的代码语句是通过/bin/bash程序来解释执行。

       是默认的解释器,还有其他类型的解释器,#!/bin/python        #!/bin/expect

    ②注释       (解释语句的含义)

        以#开头的语句表示为注释信息 # 注 释

    ③ 执行语句

        比如echo命令用于输出“ ”之间的字符串

5.如何执行脚本

    ①使用路径执行              (需要加执行权限)

       

    ②直接使用解释器           (不需要权限)

    ③source和 . 执行            (不需要权限)

使用前两种方式执行脚本会开启子bash去执行,一般用这两种

使用source和点 会影响当前的bash环境

6.  脚本错误调试

①命令错误

命令出错不会影响接下来的命令继续

 ②语法错误

  会影响接下来的命令继续

 ③逻辑错误

 只能自己去筛查

bash -n 脚本名称 (不在当前目录下加绝对路径)     检查语法错误
bash -x 脚本名称 (不在当前目录下加绝对路径)     逻辑错误

总结:脚本错误常见的有三种区别

命令错误:默认后续的命令还会继续执行,用bash -n 无法检查出来 ,可以使用 bash -x 进行

语法错误:会导致后续的命令不继续执行,可以用bash -n 检查错误,提示的出错行数不一定是准确的

逻辑错误:只能使用 bash -x 进行

在脚本前面加上set  -e,表示脚本中如果出现错误,立即停止

7. 重定向与管道符

重定向:    不输出到默认设备上,输出到你指定的位置

类型设备文件文件描述编号默认设备
标准输入/dev/stdin0键盘
标准输出/dev/stdout1显示器
标准错误输出/dev/stderr2显示器

 这些设备在/dev/目录下

交互式硬件设备

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

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

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

重定向操作

类型操作符用途
重定向输入<从指定的文件读取数据
重定向输出>将标准输出结果保存到指定的文件,并且覆盖原有文件
>>将标准输出追加到指定的文件的尾部,不覆盖原有内容
标准错误输出2>将错误信息保存到指定文件,并且覆盖原有文件
2>>将错误信息追加到指定文件的尾部,不覆盖原有内容
混合输出&>和2>&1将标准输出,标准错误保存到同—文件中

 

多行重定向

 多行重定向通常用于将多行文本内容写入文件或从文件读取

语法:命令 > 文件名 <<自定义标记符 或 : 命令  <<自定义标记符 > 文件名

管道符

将左侧的命令输出结果,作为右侧命令的输入(处理对象)可以 叠加使用

管道符左边的命令一定要有标准输出

管道符右边的命令一定要有接收标准输入

 在这个命令中,cat   /etc/passwd 列出文件内容,然后通过管道符将输出传递给 grep root。grep 命令会过滤出包含root字符串的行。

8.变量

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

         (保存将来会变化的数据,即使数据变化,直接调用变量即可,各种 Shell 环境都使用到                   “变量”的概念)

         这些参数可以根据用户的设定或系统环境的变化而相应变化

         程序能够提供更加灵活的功能,适应性更强

常见 Shell 变量的类型包括:

     自定义变量:由用户自己定义,修改和使用
     预定义变量:Bash中内置的一类变量   不能修改    规定好的变量 放在那里让你使用

     环境变量:由系统维护,用于设置工作环境      当前目录  当前主机名   $PATH     
     只读变量:只可以读取不可以更改    
     位置变量:通过命令行给脚本传递参数

     系统内置变量:PATH,UID,HOSTNAME,USER

命名要求:

        区分大小写

        不能使程序中的保留字和内置变量:如:if, for,hostname   命令  a=

        只能使用数字、字母及下划线,且不能以数字开头,注意:不支持短横线 “ - ”,和主机名相反

        不要使用内置的变量,使用英文尽量使用词义通俗易懂,PATH

        大驼峰 StudentFirstName

        小驼峰 studentFirstName

        下划线 student_name

①自定义变量

变量名命名规则:由字母或下划线打头,不允许数字开头,后面由字母、数字或下划线组成,并且大                            小写字母意义不同。在使用变量时,在变量名前加$

{}  可以定义变量的范围,确定变量的字符范围
“”(双引号) 可以识别变量
' '(单引号) 不可以识别变量
``  (反引号)可以调用命令的结果作为变量值            $(命令)也可以

命名格式为:变量名=变量值

变量可以使用命令进行追加:变量名+=需要追加的变量值

可以使用unset命令删除变量 :unset 变量名

也可以通过修改配置文件 /etc/profile 去自定义变量

添加后重新执行下文件

vim /etc/profile

 

还可以通过交互的方式自定义变量

read -p “提示信息” 变量名

②预定义变量

Shell在启动时就已经存在的变量,由系统自动初始化,具有特定含义和用途 

$HOME            当前用户的家目录路径。
$PATH              用于查找可执行文件的路径列表。
$PWD               当前工作目录(Present Working Directory)

env命令可查看当前系统有哪些预定义变量 

③环境变量

环境变量是一种特殊的预定义变量,不仅在当前Shell会话中可用,还会被所有子进程继承。

当前shell环境中定义的变量是无法自动被其它子进程继承的

需要通过export命令去赋予

  ④只读变量

通过readonly 命令来声明位置变量

只读变量不能更改或取消设置,这是bash中只读变量的一个特性

bash手册:  declare -r (与readonly相同)  -r 使名称成为只读的

                  这样,就不能通过后续赋值语句或unset为这些名称赋值

(只能重启shell环境来进行删除)

⑤位置变量

从命令行传递给脚本或函数的参数

每个参数都有一个编号,从 $0 开始,而 $1、$2、$3 等依次对应第一个、第二个、第三个参数...

$0是一个特殊变量,它代表脚本的文件名

 ⑥特殊变量

在预定义变量中,还存在一些特殊变量,比如在之前说到的$0就是一种特殊变量

$*         代表一个整体,把所有位置参数当成整体返回
$@       代表独立个体,把所有位置参数当成个体返回
$?       上一条命令的执行结果是否成功。正确为0,返回任何非0值为异常
$#         代表位置参数个数
$0         代表当前脚本的名称
$$         当前bash的pid
 

9.整数的运算

expr只能进行整数的运算

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

运算符:+加法 、-减法 、*乘法、 /除法 、%取余(取模) 

expr 变量 + 变量 进行运算

定义变量时使用[]运算

 使用((   ))进行运算

 使用let运算

 使用管道符给bc运算(可以运算小数)

i++

 ​​​​

 i++和++i之间的区别(i++ 是先赋值给j后再加     ++i是加后再赋值)

 随机取余