目录
一.shell的作用
Linux 系统中的 Shell 是一个特殊的应用程序,它介于操作系统内核与用户之间,充当了一个“命令解释器”的角色,负责接收用户输入的操作指令(命令)并进行解释,将需要执行的操作传递给内核执行,并输出执行结果。
常见的 Shell 解释器程序有很多种,使用不同的 Shell 时,其内部指令、命令行提示符等方面会存在一些区别。通过/etc/shells 文件可以了解当前系统所支持的 Shell 脚本种类。
cat /etc/shells可以查看当前系统支持的shell
查看本机的shell信息
cat /etc/shells
Linux中常见的shell
bash:基于gun的框架下发展的shell
csh:类似c语言的shell
tcsh:整合了csh提供了更多功能
sh:已经被bash替换
nologin:让用户无法登录
bash (/bin/bash)是目前大多数Linux 版本采用的默认shell
shell脚本用途
将简单的命令组合完成复杂的工作,自动化执行命令,提高工作效率
减少手工命令的重复输入,一定程度上避免人为错误
将软件或应用的安装及配置实现标准化
用于实现日常性的,重复性的运维工作,如:文件打包压缩备份,监控系统运行状态并实现告警等
1.1.Shell脚本及处理逻辑
①Shell脚本就是将命令按顺序一一列出的程序,最后自动执行。shell脚本将简单的命令组合完成负责的工作,自动化执行命令,提高工作效率,可以用于日常性重复性的运维工作。
②处理逻辑分为三种:
顺序执行:程序按从上到下的顺序执行
选择执行:程序执行过程中,根据条件的不同选择不同的分支继续执行
循环执行:程序在执行过程中需要重复执行多次某些语句(根据已知次数、已知条件)
shell脚本基本格式
#!/bin/bash #脚本声明即解释器,表示此行以下的代码通过/bin/bash程序翻译执行
#this is my frist shell #注释信息,描述此脚本做什么工作或每条语句的含义
echo " hello world! " #可执行语句,脚本具体的内容
1.2.shell执行方式
调用系统shell执行不需要给脚本加可执行(x)权限,不改变当前环境。执行格式shell +脚本名称
例如:bash abc.sh
使用路径执行脚本,需要给脚本加可执行(x)权限,不改变当前环境
添加脚本权限 chmod +x abc.sh
绝对路径执行 /mnt/a.sh
相对路径执行,进入对应目录直接执行 ./abc.sh
通过 . 或者source 来执行脚本,需要给脚本加可执行(x)权限,这俩种方式会改变当前环境不建议使用
添加脚本权限 chmod +x abc.sh
使用.执行脚本. abc.sh
使用source执行脚本 source abc.sh
bash -n 脚本名称 (绝对路径) 检查语法错误
bash -x 脚本名称 (绝对路径) 检查逻辑错误
执行方式:
(1)指定路径去执行文件(文件需要有执行权限)
(2)指定解释器去执行(文件不需要权限)
(3)使用source或点“.”执行(不需要执行权限)
查看系统程序
$PATH
1.2.shell脚本练习
二.shell变量
Shell 脚本中的变量是用于存储数据值或文本字符串的名称。变量允许您在脚本中临时保存数据,以便稍后使用。在 Shell 脚本中,您可以使用变量来存储命令输出、用户输入、中间结果等等。
在大多数 Shell(如 Bash)中,变量的命名是区分大小写的,并且通常使用大写字母。以下是如何在 Bash 中定义和使用变量的示例:
#!/bin/bash
# 定义一个变量
NAME="John"
# 使用变量 echo "Hello, $NAME!"
# 重新赋值变量 NAME="Alice"
echo "Hello again, $NAME!"
在这个示例中,我们定义了一个名为 NAME
的变量,将其设置为 "John",然后使用 echo
命令输出包含该变量的消息。然后,我们将变量重新赋值为 "Alice" 并再次输出。
还有一些特殊的变量,如:
$0
:脚本名称。$1
、$2
、...:脚本的参数,其中$1
是第一个参数,$2
是第二个参数,依此类推。$#
:参数的数量。$@
:所有参数的列表。$?
:上一个命令的退出状态(返回值)。$$
:当前 Shell 进程的进程 ID。
脚本错误调试:
脚本常见的错误有三种:语法错误,命令错误,逻辑错误
1)语法错误,会导致后续的命令不继续执行,可以用bash -n 检查错误,提示的出错行数不一定是准确的
2)命令错误,默认后续的命令还会继续执行,用bash -n 无法检查出来 ,可以使用 bash -x 进行观察
3)逻辑错误:只能使用 bash -x 进行
bash -n 脚本名称 (不在当前目录下加绝对路径) 检查语法错误
bash -x 脚本名称 (不在当前目录下加绝对路径) 逻辑错误
2.1.变量的作用
用来存放系统和用户需要使用的特定参数
2.2.变量名要求
- 区分大小写
- 不能使程序中的保留字和内置变量:如:if, for,hostname 命令 a=
- 只能使用数字、字母及下划线,且不能以数字开头,注意:不支持短横线 “ - ”,和主机名相反
- 不要使用内置的变量,使用英文尽量使用词义通俗易懂,PATH
- 大驼峰 StudentFirstName
- 小驼峰 studentFirstName
- 下划线 student_name
自定义变量格式:
变量名=变量值 #=号前后不能有空格 直接字串:name='root' 变量引用: 弱引用和强引用 $()或者` ` 直接调用命令 |
2.3.变量类型
常见的变量类型:
①只读变量:只可以读取不能修改的变量,相当于常量,用处较少
readonly 变量名 #将变量声明为只读变量
变量值不允许修改(重新赋值)的情况
无法使用 unset删除
最快方法重启
②环境变量:系统维护的变量,用于设置工作环境,使用env命令可以查看所有环境变量
$USER 表示用户名称
$HOME 表示用户的家目录
$LANG 表示语言和字符集
$PWD 表示当前所在工作目录
$PATH 表示可执行用户程序的默认路径
由系统提前创建,用来设置用户的工作环境
可以使用env查看所有环境变量
需要记住的常用环境变量
环境变量的全局配置文件:
/etc/profile #配置文件位置
#修改此文件,全局生效,可用于长期变更或设置环境变量
整数变量:
expr只能进行整数的运算
格式: expr 变量1 运算符 变量2 [运算符 变量3]
运算符:加法 + 减法 - 乘法 \ * 除法 / 取余 (取模)%
#运算法则
加法:num1 + num2
减法:num1 - num2
乘法:num1 \ * num2
整除:num1 / num2
取余(求模):num1 % num2 (求 num1 除以 num2 的余数)变量和运算符之间要用空格隔开
加法运算:
(1) let var=算术表达式
(2) $((var=算术表达式)) 和上面等价
(3) var= $[算术表达式]
(4) var=$((算术表达式))
(5) var=$(expr arg1 arg2 arg3 ...)
(6) var= `expr arg1 arg2 arg3 ...`
(7) echo '算术表达式' | bc
④位置变量
$1, $2, $3, … $n 表示命令行参数的位置值,位置变量也称为位置参数
$1 表示第一个参数,$2 表示第二个参数,以此类推。
当n大于9时,需要加上{ },比如第十个位置,要用 ${10}表示
echo "$1" 位置1
echo "$2" 位置2
echo "${10}" 位置10
echo "$10" 位置1和0
echo "$*" 将所有项当成一个值
echo "$@" 所有项
echo "$0" 脚本自身
echo "$#" 后面参数的个数$0 表示当前脚本的名字
⑤预定义变量***
$*:表示所有位置参数的内容看成一个整体返回 返回所有
$@:表示所有位置参数的内容分割成n份,每份作为一个独立的个体返回 返回所有
$?:表示前一条命令执行后的返回状态,返回值为 0 表示执行正确,返回任何非 0值均表示执行出现异常
$#:表示命令行中位置参数的总个数
$0:表示当前执行的脚本或程序的名称 当前脚本的名字
$$:当前进程id
$!: 后台任务最后一个id
2.4.read -p
read -p
是 Bash 脚本中常用的命令组合,用于从用户获取输入并存储到变量中。这个命令允许您在运行脚本时与用户进行交互,以便动态地获取输入值。
read -p
命令的语法如下:read -p "prompt_message" variable_name
其中:
-p
选项表示在请求输入之前,显示一个提示信息给用户。"prompt_message"
是您希望显示给用户的提示消息。variable_name
是您希望将用户输入存储到的变量的名称。
以下是一个简单的示例,演示如何使用 read -p
命令来获取用户的名字并存储到变量中:
#!/bin/bash
# 请求用户输入名字并存储到变量
read -p "请输入您的名字: " NAME
# 显示用户输入的名字
echo "您好,$NAME!"
在这个示例中,
read -p
命令提示用户输入名字,然后将输入的值存储到NAME
变量中。接着,使用echo
命令将用户输入的名字输出。通过
read -p
命令,您可以轻松地与用户进行交互,接受输入,然后在脚本中使用这些输入来进行处理。
2.5.将局部变量变为全局变量
在 Bash 脚本中,变量的作用域通常是局部的,意味着它们只在定义它们的代码块内部可见。然而,有一些方法可以将局部变量变为全局变量,以便在整个脚本中访问它们。
局部变量:新定义的变量只在当前的shell环境中有效,当进入子程序或新的shell环境中,局部变量将无法再起作用。
全局变量:在新的shell环境中可以继续使用。
1. 使用 export
命令: 在 Bash 中,您可以使用 export
命令将局部变量导出为环境变量,从而使其成为全局变量。环境变量可以在整个脚本及其子进程中访问。
#!/bin/bash
# 定义局部变量
local_var="局部变量"
# 导出为全局变量
export global_var="$local_var"
# 在脚本中访问全局变量
echo "全局变量的值为:$global_var"
2.在主 Shell 进程中定义: 如果您在交互式 Shell 中运行脚本,您可以将变量直接定义在主 Shell 进程中,使其成为全局变量。
3. 使用 .
命令(点命令)或 source
命令: 这两个命令允许您在当前 Shell 进程中执行脚本,从而使脚本中的变量在当前 Shell 环境中可见。
#!/bin/bash
# 将脚本内容放在一个文件中,例如 script.sh
# 定义局部变量
local_var="局部变量"
# 在当前 Shell 中运行脚本
. ./script.sh
# 在当前 Shell 中访问脚本中的变量
echo "在当前 Shell 中访问变量:$local_var"
要注意的是,直接在主 Shell 进程中定义变量、使用环境变量以及通过 .
命令或 source
命令执行脚本都可以将局部变量变为全局变量,但这也可能会导致命名冲突或不必要的变量污染。确保您了解全局变量的作用范围,并谨慎使用,以避免出现意外的问题。
2.5.主要指执行脚本时后面所跟着位置
$1-$9:脚本后1-9的位置
${10}:脚本后10以上的位置需要借助变量分隔符{},不然会将$1认为是一个位置变量然后输出再加上后面的数字。
$*:表示所有位置参数的内容看成一个整体返回
$@:表示输出脚本后的所有位置参数,且认为每个是独立的值
$0:表示当前执行的脚本或程序的名称 当前脚本的名字
$#:表示命令行中位置参数的总个数
$?:表示前一条命令执行后的返回状态,返回值为 0 表示上一条命令执行正确,返回任何非 0值均表示执行出现异常。使用方法echo $?
$!:后台任务最后一个id,使用方法echo $!
2.5.变量的作用范围
默认情况下,新定义的变量只在当前的shell环境中有效,因此称为局部变量,当进入子程序或新的shell环境中,局部变量将无法再起作用。
可以通过内部命令export将指定的变量为全局变量,使用户定义的变量在所有子shell环境中可以继续使用
全局变量格式1: export 变量名
全局变量格式2:export 变量名=变量值