shell 脚本

一,脚本概述

(一)脚本三种处理逻辑

1,顺序执行:程序按从上到下顺序执行
2,选择执行:程序执行过程中,根据条件的不同,进行选择不同分支继续执行

3,循环执行:程序执行过程中需要重复执行多次某段语句(已知次数 已知条件 死循环)

(二)脚本概念

脚本简单理解        就是命令的集合

将要执行的命令按顺序保存到一个文本文件,给该文件可执行权限,可结合各种Shell控制语句以完成更复杂的操作。

(三)脚本应用场景

重复性操作

交互性任务

批量事务处理

服务运行状态监控

定时任务执行

(四)脚本的构成

1,解释器 (脚本是用什么语言写的) 可以不写

2, 注释 (解释语句的含义) 可以不写

3, 执行语句

shell 脚本_第1张图片

(五)脚本执行的方法

1,使用解释器 bash (不需要权限)

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

当以路径执行,权限不够

shell 脚本_第2张图片

加上执行权限,再此以路径执行

shell 脚本_第3张图片

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

shell 脚本_第4张图片

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

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

所以推荐用bash 解释器执行

(六)想让脚本的路径可以补全

做一个软连接

(七)脚本的报错

1,命令错误

命令出错 不会影响下面命令的执行

2,语法错误

shell 脚本_第5张图片

3,逻辑错误

想要猫,得到狗

(八)脚本出错检测

1,bash -x 把脚本的每一步都执行一遍

2,bash -n 检查语法

不在当前目录下加绝对路径

shell 脚本_第6张图片

(九)脚本的错误预防(set  -e    set   -u)

1,set   -e   只要 出错立即停止

shell 脚本_第7张图片

2,set   -u  变量不存在不让执行

shell 脚本_第8张图片

二,重定向 与 管道符

(一)重定向

1,重定向定义

重定向的意思就是,不输出到默认设备上,输出到你指定的位置(文件 其他输出设备)

2,重定向类型

类型 设备文件 文件描述编号
标准输入 /dev/stdin 0
标准输出 /dev/stdout 1
标准错误输出 /dev/stderr 2

重定向类型  来源:

3, 将错误的和正确的一起重定向

shell 脚本_第9张图片

例题:以下不能将正确和错误一起显示出来的是

[root@centos7 ~]#ls /data /xxx 1> /data/all.log 2>&1
[root@centos7 ~]#ls /data /xxx 2> /data/all.log 1>&2 
[root@centos7 ~]#ls /data /xxx &> /data/all.log  
[root@centos7 ~]#ls /data /xxx >& /data/all.log  

[root@centos7 ~]#ls /data /xxx   2>&1 1> /data/all.log

1代表 正确输入
2代表 错误输入
&    代表混合

[root@centos7 ~]#ls /data /xxx   2>&1 1> /data/all.log    不可以

(二)标准输入重定向

shell 脚本_第10张图片

(三)多行重定向

Here Document 概述 使用 I/O 重定向的方式将命令列表提供给交互式程序或命令,比如 ftp、cat 或 read 命令。 HereDocument是标准输入的一种替代品, 可以帮助脚本开发人员不必使用临时文件来构建输入信息, 而是直接就地生产出一个文件并用作命令的标准输入。

shell 脚本_第11张图片

三,shell 变量

(一)shell 变量基础

1,常见 Shell 变量的类型包括

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


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

2,命名要求

  • 区分大小写

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

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

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

  • 大驼峰 StudentFirstName

  • 小驼峰 studentFirstName

  • 下划线 student_name

(二)自定义变量  具体介绍

1,定义自定义变量  调用自定义变量

shell 脚本_第12张图片

取消变量:

unset 变量名

2,变量相关符号

2.1,双引号 弱引用 可以识别变量

shell 脚本_第13张图片

2.2,单引号 强引用 不能识别变量

2.3,{ } 定义变量名的 范围

shell 脚本_第14张图片

2.4, `` 反撇 调用命令的执行结果 和$()功能一样

shell 脚本_第15张图片

2.5,必须要用单引号,但想要显示变量(两个单引号 )

2.6, 四个符号 灵活应用

如: 同时ping 192.168.91网段的 所有ip

shell 脚本_第16张图片

shell 脚本_第17张图片

3,变量与别名

变量在一定程度可以当做别名使用

shell 脚本_第18张图片

 4,变量追加值

shell 脚本_第19张图片

5,交互的去定义变量 read  -p

交互式的输入变量值,然后 使用变量

shell 脚本_第20张图片

6,将自定义的变量全局生效  export

6.1 bash

bash:linux 桌面环境

bash作用: 输入命令bash  会进入当前bash的子bash     就是进入另一个桌面环境,当做出可能影响的操作时,直接exit 退出当前子bash     回到父bash

当你切换用户时  su -    和   su    之后的bash     都不是之前的子bash   都是新的bash

shell 脚本_第21张图片

su -    和   su  区别:

su  不彻底  新用户  会继承老用户的  环境变量

shell 脚本_第22张图片

6.2bash配置文件

一旦你登录 bash 环境 会读取以下四个文件 进行个性化配置

登录时进行操作,任何可以执行的命令都可以写进去

只对当前用户生效:

~/.bashrc      ~/.bash_profile

对系统里的所有人生效

/etc/profile     /etc/profile.d/*.sh

6.3 export

自定义的变量只能在当前bash 环境生效

想这个变量在所有的子(孙)bash 环境生效,加export(局部变量 变全局变量 )

shell 脚本_第23张图片

7,整数变量的运算(4种写法)

运算符:

加法 +

减法 -

乘法 \ *      (*   是乘法     \ 转义,指表示原来的意思)

除法 /

取余 (取模)%

% 的意思,是除了之后取余数,如  6   %   3     值为0

                                                        100 %  33  值为1

                随机一个数(范围0到32767)  % 33  值为0到32(不可能是33  33可以被整除)

7.1 expr

expr只能进行整数的运算

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

7.2  bc  计算机

bc 能用小数

7.3    let

7.4  变量名=$[运算]; echo $变量名

shell 脚本_第24张图片

7.5 加入变量

shell 脚本_第25张图片

8,   取随机数值   (RANDOM    与取余 % )  

$RANDOM  这个变量取值范围:0-32767

(会在这个范围随机取数)

要求:取   1 到33随机数

 RANDOM%33    可以得到0 到32的任意数值,因为0到32767   除以    33

余数只可能是0到   32  

9,启用颜色

shell 脚本_第26张图片

10,生成一个电脑基础信息的脚本

shell 脚本_第27张图片

 shell 脚本_第28张图片

可以通过sz命令    把脚本放到别的计算机去执行

 (三)环境变量具体介绍

1,环境变量定义

  1. 由系统提前创建,用来设置用户的工作环境

  2. 可以使用env查看环境变量

2,需要记住的常用环境变量

$USER 表示用户名称

$HOME 表示用户的宿主目录

$LANG 表示语言和字符集

$PWD 表示当前所在工作目录

$PATH 表示可执行用户程序的默认路径

3,环境变量注意事项

  • 可以使子进程(包括孙子进程)继承父进程的变量,但是无法让父进程使用子进程的变量

  • 一旦子进程修改从父进程继承的变量,将会新的值传递给孙子进程

  • 一般只在系统配置文件中使用,在脚本中较少使用

4,环境变量的全局配置文件

配置文件位置在

/etc/profile如果修改此文件会作用于所有用户

~/.bash_profile 用户独立的配置文件,修改这个文件只作用于当前用户

(四)只读变量readonly

变量值不允许修改(重新赋值)的情况

无法使用 unset删除

最快方法重启

shell 脚本_第29张图片

(五)位置变量

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

就是字面意思,                根据脚本里的位置顺序,显示bash  脚本后对应的值

shell 脚本_第30张图片

shell 脚本_第31张图片

(六) 预定义(状态)变量

1,预定义变量  定义

  • $*:表示所有位置参数的内容看成一个整体返回 返回所有

  • $@:表示所有位置参数的内容分割成n份,每份作为一个独立的个体返回 返回所有

  • $?:表示前一条命令执行后的返回状态,返回值为 0 表示执行正确,返回任何非 0值均表示执行出现异常

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

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

  • $$:当前bash的进程id

  • $!: 后台任务最后一个id

bash 帮你定义好了 拿来用就可以了,你不需要知道为什么,记住

2,$*   和$@   都表示所有位置参数

shell 脚本_第32张图片

shell 脚本_第33张图片

3,$*   和$@   的区别

$* 把a到z 看成一个整体

$@ a 到 z 各自是一个整体

echo "$*"            将所有项当成一个值
echo "$@"            独立个体
echo "$#"            后面参数的个数

3.1实验认证
 

脚本3  是打印第一个位置参数

脚本1  和脚本2  的结果  都交给脚本3,   输出$1

shell 脚本_第34张图片

两者结果不同

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

只能是上一个命令   0是正确   非0  为不正确

shell 脚本_第35张图片

5,$#:表示命令行中位置参数的总个数

shell 脚本_第36张图片

shell 脚本_第37张图片

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

shell 脚本_第38张图片

shell 脚本_第39张图片

把脚本做软连接   会显示软连接的名字

你可能感兴趣的:(bash,开发语言)