文章目录
shell脚本
shell是应该程序,也是一个解释器,用于“翻译”各种环境(弱语言)
概念
- 将要执行的命令按顺序保存到一个文本文件
- 给该文件可执行权限
- 可结合各种Shell控制语句以完成更复杂的操
应用场景
- 重复性操作
- 交互性任务
- 批量事务处理
- 服务运行状态监控
- 定时任务执行
作用
- 自动化运维
- 批量化重复操作可以编写脚本结合计划任务自动周期运行
- 减轻管理员工作量
- 提高处理文本文件的速度
- 避免配置出错
Linux中的Shell(解释器)
检查一下/etc/shells这个文件,里面就是Linux所包含的Shell
-
sh:UNIX最初使用的 shell)已经被bash所替换
-
bash:基准开GNU的框架下发展出的Shell的扩展
-
csh:语法有点类似于c语言的Shell
-
tcsh:整合了csh,提供更多的功能。
-
nologin:奇怪的shell,这个shell可以让用户无法登录主机。
-
zsh
-
fish
注:bash(/bin/bash)是目前大多数 Linux 版本采用的默认 Shell
脚本构成
1.脚本申明(解释器):
#!/bin/bash:表示此行以下的代码语句是通过/bin/bash程序来解释执行
#!/bin/bash为默认解释器。
还有其它类型的解释器,比如 #!/usr/bin/python 、 #!/usr/bin/expect.
#! shebang ——》申明,此脚本使用哪个解释器环境/解释器类型
#/bin/bash 解释器类型
2.注释信息:
以“#”开头的语句表示为注释信息,被注释的语句在运行脚本时不会被执行。
3.可执行语句:
比如echo命令,用于输出""之间的字符串
vim /root/first.sh
#!/bin/bash
#This is my first Shell-Script
cd /boot
echo"当前的目录位于:"
pwd
echo"其中以 vml 开头的文件包括:"
ls -lh vml*
脚本的执行
方法一
指定路径的命令,要求文件必须有 x权限
chmod +x /root/first.sh
指定绝对路径:/root/first.sh
指定相对路径:./first.sh
方法二
指定Shell来解释脚本,不要求文件必须有x权限
- sh脚本路径:sh first.sh
- source 脚本路径:.first.sh 或者 source first.sh
—source 点命令 .
功能
source命令通常用于重新执行刚修改的初始化文件,使之立即生效,而不必注销并重新登录。因为linux所有的操作都会变成文件的格式存在。
生效范围是当前shell会话
三个执行脚本文件命令
- source filename
- sh filename
- ./filename
区别
-
当shell脚本具有可执行权限时,用sh filename与./filename是没有区别的。
./filename是因为当前目录没有在PATH中,所以".“是用来表示当前目录的。 -
sh 会重新建立一个子shell
子shell的概念(shell列表的理念)
目的
多进程并行处理任务
小括号()表示开启子shell列表
小括号中引用的命令表示嵌套子shell,(echo $BASH_SUBSHELL->查看当前子shell个数)
示例
(ls;echo $BASH_SUBSHELL)
也可以嵌套执行:
(ls(echo $BASH_SUBSHELL))
(ls(pwd(echo $BASH_SUBSHELL)))
以上操作为并行多进程处理任务
- source 没有建立新的子shell。脚本里面所有新建、改变变量的语句都会保存在当前shell里面。
重定向操作
类型 | 操作符 | 用途 |
---|---|---|
重定向输入 | < | 从指定的文件读取数据 |
重定向输出 | > | 将标准输出结果 保存 到指定的文件,并且覆盖原有内容 |
>> | 将标准输出结果 追加 到指定的文件的尾部,不覆盖原有内容 | |
重定向错误输出 | 2> | 将错误信息 保存 到指定的文件,并且覆盖原有内容 |
2>> | 将错误信息 追加 到指定的文件的尾部,不覆盖原有内容 | |
混合输出 | &> | 将标准输出、标准错误保存到同一文件中 |
2>&1 | 将标准错误输出重定向到标准输出 |
变量
变量的作用
用来存放系统和用户需要使用的特定参数(值)
- 变量名:使用固定的名称,由系统预设或用户定义
- 变量值:能够根据用户设置、系统环境的变化而变化
变量作用范围
环境变量的全局配置文件为/etc/profile,在此文件中定义的变量作用于所有用户。
每个用户还有自己的独立配置文件(~/.bash profile)。可以用来长期变更或设置某个环境变量
局部变量
默认情况下,新定义的变量只在当前的Shell环境中有效,因此称为局部变量。
当进入子程序或新的子Shell环境时,局部变量将无法再使用。
可以通过内部命令export将指定的变量导出为全局变量,使用户定义的变量在所有的子Shel!环境中能够继续使用。
格式1:expont 变量名
格式2:expont 变量名=变量值
全局变量
在程序或脚本中定义的具有全局范围的变量。
这意味着全局变量在整个程序或脚本的不同部分都是可见和可访问的,而不仅限于特定的函数、方法或代码块。
主要特点
全局范围: 全局变量在整个程序或脚本的各个部分都是可见和可访问的。
持久性: 全局变量的生命周期与程序的执行时间相同。它们在程序启动时创建,在程序结束时销毁。
共享性: 全局变量可以在程序的不同函数或方法之间共享数据。这样,多个函数可以使用和修改相同的全局变量,
潜在的副作用
全局变量的使用可能导致副作用和潜在的复杂性。
因为全局变量是可访问的,所以它们可以被任何函数修改,
这可能导致程序状态的不确定性和难以调试的问题。
变量的类型
- 自定义变量:由用户自己定义、修改和使用
- 特殊变量:环境变量,只读变量,位置变量,预定义变量
环境变量:由系统提前创建,用来设置用户的工作环境
位置变量:用于将外部数据传递给脚本或程序,以便根据需要进行处理。 ($1 $2 )
预定义变量:通常由编程语言或脚本解释器提供,并根据需要自动设置和更新,不能修改
"$*":把所有参数看成以空格分隔的一个字符串整体(单字符串)返回,代表"$1 $2 $3 $4"。
"$@":把各个参数加上双引号分隔成n份的参数列表,每个参数作为一个字符串返回,代表"$1" "$2" "$3" "$4"。
$0:表示当前执行的脚本或命令的名称。
$#:表示命令或脚本要处理的参数的个数。
$?:表示前一条命令或脚本执行后的返回状态码,返回值为0表示执行正确,返回任何非0值均表示执行出现异常。也常被用于Shell脚本中return退出函数并返回的退出值。
变量名
使用固定的名称,由系统预设或用户定义
- 不要使用系统的命令作为变量名
- 不要使用中文
- 不能特殊符号开头 可以用_来开头
- 在指定变量名的时候有一个默认的规则:计算机:computer 学生:student
- 要有注释,还要注意前后一致
- 只能包含字母、数字、下划线
- 严格区分大小写
变量值
能够根据用户的设置、系统环境的变化而变化
int 整形: 1 2 13 444
string 字符串: zhangsan lisi abc123
布尔值: true false 0 1——》判断的是指定条件的“真”or“假”,通常用于分支判断
浮点flot: 1.1 2.2
双精度浮点值: 1.2131
txt: 文本类型
自定义变量
由用户自己定义、修改和使用
定义新的变量
格式:变量名=变量值
变量命名规则:以字母或下划线开头,区分大小写
product=benet
version=6.0
name="zhang san“
查看变量的值
格式:echo$变量名
echo $product
echo $product $version
echo ${product}40
${}是一种特殊的语法形式,用于获取变量的值或者对变量进行操作。
语法可以应用于任何变量名称,其中变量名称放在花括号中,例如
{}语法可以应用于任何变量名称,其中变量名称放在花括号中,例如
语法可以应用于任何变量名称,其中变量名称放在花括号中,例如{product},其中VAR是变量名
—readonly 命令设置只读变量
product=benet
readonly product #设置为只读变量
echo $product
product=accp #只读变量不可以被重新赋值
unset product #只读变量不可以被删除(需要强制),unset 命令用于删除常规变量