Shell脚本 1

发布时间:2024年01月23日

一、shell脚本基础

1.shell的作用

Linux 系统中的 Shell 是一个特殊的应用程序,它介于操作系统内核与用户之间,充当
了一个“命令解释器”的角色,负责接收用户输入的操作指令(命令)并进行解释,将需要执
行的操作传递给内核执行,并输出执行结果。
常见的 Shell 解释器程序有很多种,使用不同的 Shell 时,其内部指令、命令行提示符
等方面会存在一些区别。通过/etc/shells 文件可以了解当前系统所支持的 Shell 脚本种类。

cat? ?/etc/shells###查看当前系统支持的shell

linux中常见的shell

---bash:基于gun的框架下发展的shell
---csh:类似c语言的shell
---tcsh:整合了csh提供了更多功能
---sh:已经被bash替换
---nologin:让用户无法登录

bash (/bin/bash)是目前大多数Linux 版本采用的默认shell

shell脚本用途

- 将简单的命令组合完成复杂的工作,自动化执行命令,提高工作效率
- 减少手工命令的重复输入,一定程度上避免人为错误
- 将软件或应用的安装及配置实现标准化
- 用于实现日常性的,重复性的运维工作,如:文件打包压缩备份,监控系统运行状态并实现告警等

1.2什么是shell脚本及构成

- 就是将命令按顺序一一列出,最后自动执行
- 执行需要权限,也可以直接使用路径 ? ?
- 脚本其实不复杂,通用脚本环境改变后依然可以使用的脚本

构成

1. 脚本申明(解释器):第一行开头“#!/bin/bash”,表示此行以下的代码语句是通过/bin/bash程序来解释执行。#!/bin/bash为默认的解释器还有其他类型的解释器,#!/bin/python ? ? ?#!/bin/expect
2. 注释信息:以#开头的语句表示为注释信息 ? ? ? ? # 注 释?
3. 可执行语句:比如echo命令用于输出“ ? ?”之间的字符串

1.3如何执行脚本

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

不管绝对路径还是相对路径执行,都要加权限才行

2.直接使用shell解释器来运行脚本的命令(不需要权限)

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

1.4脚本的例子和错误调式

1.三种切到文件夹下的不同

原因:

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

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

source 和 .? 没有子进程,会影响当前环境

前两种会产生子进程,不会影响当前环境

子进程运行完就会结束,自行消失

2.执行命令脚本

3.前一条命令错误,不会影响下一跳命令

4.这种情况下,打错不行,所以尽量不要打错

5.命令错误

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

hostname
echo 'finsh'

6.语法错误

会影响接下来的命令继续

7.逻辑错误

只能自己去排查

比如:你回家想先吃饭,但你去睡觉了,事情没毛病,但和你一开始的想法,逻辑不对。?

bash? ? -n###检查语法错误

bash? ? -e###检查逻辑错误

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

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

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

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

写脚本目的:避免人机交互

shell的作用:命令解释器

1.5脚本执行逻辑及执行方式

脚本执行逻辑

1. ?顺序执行:程序按从上到下顺序执行 ? ? ? ??

2. ?选择执行:程序执行过程中,根据条件的不同,进行选择不同分支继续执行

3. ?循环执行:程序执行过程中需要重复执行多次某段语句

执行方式

1. 指定路径去执行文件(需要有执行权限)

[root@localhost ~]# chmod +x /root/host.sh ? ?加权限
指定相对路径./host.sh
指定绝对路径/root/host.sh

2.指定shell解释器去执行(不需要权限)

[root@localhost ~]# bash host.sh 192.168.91.1
与真机网络通顺

指定了使用 bash去执行脚本不需要权限

[root@localhost ~]# . qiuhe.sh
[root@localhost ~]#source qiuhe.sh ? ?// 会影响当前环境
[root@localhost ~]#source first.sh?
当前的目录位于:
/boot
其中以vml开头的文件包括:
-rwxr-xr-x. 1 root root 5.7M 8月 ? 6 21:02 vmlinuz-0-rescue-869dbd607e5e4f758fa152ef2229f2b6
-rwxr-xr-x. 1 root root 5.7M 8月 ?23 2017 vmlinuz-3.10.0-693.el7.x86_64
[root@localhost boot]#?
会影响你的当前目录
[root@localhost ~]# cat qiuhe.sh | bash
结果是5050
[root@test1 ~]# vim first.sh

cd /root
pwd
ls -l
添加执行权限的方法
[root@test1 ~]# $PATH ? ? ? ? ? ? ? ? ? //查看系统程序
-bash: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin: 没有那个文件或目录
[root@test1 ~]# pwd
/root
[root@test1 ~]# mkdir bin ? ? ? ? ? ? ?//新建bin文件夹
[root@test1 ~]# ls
bin ?disk.sh ?first.sh ?gs.sh ?g.txt ?passwd.txt ?sdb.sh ?source
[root@test1 ~]# cp first.sh bin/ ? ? ? //将脚本拷入 此方法不限制路径
[root@test1 ~]# first.sh ? ? ? ? ? ? ? //执行脚本 ? ? ? ??
/root
总用量 24
drwxr-xr-x. 2 root root ?22 7月 ?22 11:33 bin
-rwxr-xr-x. 1 root root ?62 7月 ?16 11:05 disk.sh
-rwxr-xr-x. 1 root root ?29 7月 ?22 10:50 first.sh
-rwxr-xr-x. 1 root root 142 7月 ?16 14:28 gs.sh
-rw-r--r--. 1 root root ?63 7月 ?16 11:36 g.txt
-rw-r--r--. 1 root root ? 9 7月 ?19 10:15 passwd.txt
-rwxr-xr-x. 1 root root ?61 7月 ?16 11:14 sdb.sh
drwxr-xr-x. 2 root root ? 6 7月 ?20 09:33 source

[root@test1 ~]# ./first.sh ? ? ? ?//需要权限
/root
总用量 24
drwxr-xr-x. 2 root root ?22 7月 ?22 11:33 bin
-rwxr-xr-x. 1 root root ?62 7月 ?16 11:05 disk.sh
-rwxr-xr-x. 1 root root ?29 7月 ?22 10:50 first.sh
-rwxr-xr-x. 1 root root 142 7月 ?16 14:28 gs.sh
-rw-r--r--. 1 root root ?63 7月 ?16 11:36 g.txt
-rw-r--r--. 1 root root ? 9 7月 ?19 10:15 passwd.txt
-rwxr-xr-x. 1 root root ?61 7月 ?16 11:14 sdb.sh
drwxr-xr-x. 2 root root ? 6 7月 ?20 09:33 source

[root@test1 ~]# ./first.sh ? ? ? ? ??
-bash: ./first.sh: 权限不够
[root@test1 ~]# source first.sh ? ? ? ? ? ?//source无需权限
/root
总用量 24
drwxr-xr-x. 2 root root ? 6 7月 ?22 11:41 bin
-rwxr-xr-x. 1 root root ?62 7月 ?16 11:05 disk.sh
-rw-r--r--. 1 root root ?29 7月 ?22 10:50 first.sh
-rwxr-xr-x. 1 root root 142 7月 ?16 14:28 gs.sh
-rw-r--r--. 1 root root ?63 7月 ?16 11:36 g.txt
-rw-r--r--. 1 root root ? 9 7月 ?19 10:15 passwd.txt
-rwxr-xr-x. 1 root root ?61 7月 ?16 11:14 sdb.sh
drwxr-xr-x. 2 root root ? 6 7月 ?20 09:33 source
[root@test1 ~]# sh first.sh ? ? ? ?//sh无需权限
/root
总用量 24
drwxr-xr-x. 2 root root ? 6 7月 ?22 11:41 bin
-rwxr-xr-x. 1 root root ?62 7月 ?16 11:05 disk.sh
-rw-r--r--. 1 root root ?29 7月 ?22 10:50 first.sh
-rwxr-xr-x. 1 root root 142 7月 ?16 14:28 gs.sh
-rw-r--r--. 1 root root ?63 7月 ?16 11:36 g.txt
-rw-r--r--. 1 root root ? 9 7月 ?19 10:15 passwd.txt
-rwxr-xr-x. 1 root root ?61 7月 ?16 11:14 sdb.sh
drwxr-xr-x. 2 root root ? 6 7月 ?20 09:33 source

1.6set -e

#########一旦出错,立即停止

1.7set? ?-u

变量不存在,不让执行

二、重定向

2.1重定向

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

交互式硬件设备

- 标准输入:从该设备接收用户输入的数据
- 标准输出:通过该设备向用户输出数据
- 标准错误:通过该设备报告执行出错信息

重定向的意思就是 ,不输出到默认设备上,输出到你指定的位置

类型操作符用途
重定向输入<从指定的文件读取数据,而不是从键盘输入
重定向输出1>将输出结果保存到指定的文件(覆盖原有内容)
>>将输出结果追加到指定的文件尾部
标准错误输出2>将错误信息保存到指定的文件(覆盖原有内容
2>>标准错误输出结果追加到指定的文件尾部
混合输出&>无论对错都可以重定向将标准输出、标准错误的内容保存到同一个文件中

1.命令

2.2多行重定向

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

2.3管道符

管道符 ? ? ? | ??

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

[root@localhost opt]# ls /opt |wc
? ? ? 2 ? ? ? 2 ? ? ?12

修改密码
[root@localhost opt]# echo "123123" |passwd --stdin zhangsan
更改用户 zhangsan 的密码 。
passwd:所有的身份验证令牌已经成功更新

[root@test1 ~]# grep "/bin/bash$" /etc/passwd
root:x:0:0:root:/root:/bin/bash
zhangsan:x:1000:1000:zhangsan:/home/zhangsan:/bin/bash
lisi:x:1001:1001::/home/lisi:/bin/bash
[root@test1 ~]# grep "/bin/bash$" /etc/passwd | awk -F: '{print $1,$7}'
root /bin/bash
zhangsan /bin/bash
lisi /bin/bash


?
` ? ` ?$( ?) ? ?调用命令执行的结果
' ?' ?强引用 ?不识别变量 ? 本来含义
" ?" ?弱引用 ?他识别变量
{ } ? 规定变量的范围

三、变量

变量来源于数学,是计算机语言中能储存计算结果或能表示值的抽象概念。

保存将来会变化的数据,即使数据变化,直接调用变量即可,各种 Shell 环境中都使用到了“变量”的概念。Shell 变量用来存放系统和用户需要使用的特定参数(值),而且这些参数可以根据用户的设定或系统环境的变化而相应变化。通过使用变量,Shell 程序能够提供更加灵活的功能,适应性更强。

3.1变量基础

常见 Shell 变量的类型包括:

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

3.1.1命名要求

- 区分大小写

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

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

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

- 大驼峰 StudentFirstName?

- 小驼峰 studentFirstName?

- 下划线 student_name

特殊符号

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

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

{ ? ? }###定义变量0的范围

``###调用命令的执行结果 ?= ?$() ? 功能一致

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