shell 脚本

发布时间:2024年01月23日

一,脚本概述

(一)脚本三种处理逻辑

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

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

(二)脚本概念

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

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

(三)脚本应用场景

重复性操作

交互性任务

批量事务处理

服务运行状态监控

定时任务执行

(四)脚本的构成

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

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

3, 执行语句

(五)脚本执行的方法

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

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

当以路径执行,权限不够

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

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

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

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

所以推荐用bash?解释器执行

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

做一个软连接

(七)脚本的报错

1,命令错误

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

2,语法错误

3,逻辑错误

想要猫,得到狗

(八)脚本出错检测

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

2,bash -n 检查语法

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

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

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

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

二,重定向 与 管道符

(一)重定向

1,重定向定义

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

2,重定向类型

类型设备文件文件描述编号
标准输入/dev/stdin0
标准输出/dev/stdout1
标准错误输出/dev/stderr2

重定向类型? 来源:

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

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

[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? ? 不可以

(二)标准输入重定向

(三)多行重定向

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

三,shell?变量

(一)shell?变量基础

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

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


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

2,命名要求

  • 区分大小写

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

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

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

  • 大驼峰 StudentFirstName

  • 小驼峰 studentFirstName

  • 下划线 student_name

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

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

取消变量:

unset 变量名

2,变量相关符号

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

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

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

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

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

2.6,?四个符号 灵活应用

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

3,变量与别名

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

?4,变量追加值

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

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

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

6.1?bash

bash:linux 桌面环境

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

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

su - ? ?和 ? su? 区别:

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

6.2? export

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

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

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 $变量名

7.5?加入变量

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

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

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

要求:取? ?1?到33随机数

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

余数只可能是0到? ?32??

?

9,启用颜色

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

?

?

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

?

?(三)环境变量具体介绍

1,环境变量定义

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

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

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

$USER 表示用户名称

$HOME 表示用户的宿主目录

$LANG 表示语言和字符集

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

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

3,环境变量注意事项

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

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

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

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

配置文件位置在

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

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

(四)只读变量readonly

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

无法使用 unset删除

最快方法重启

(五)位置变量

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

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

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

1,预定义变量? 定义

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

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

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

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

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

  • $$:当前bash的进程id

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

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

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

3,$*? ?和$@? ?的区别

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

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

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

3.1实验认证
?

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

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

两者结果不同

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

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

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

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

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

文章来源:https://blog.csdn.net/wyq2070857323/article/details/135769739
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。