格式与执行方式
注释
- 单行注释
#注释内容- 多行注释
:<<!#注释内容#注释内容!解释器
- 意义在告诉脚本使用什么解释器
#!/bin/bash执行方式
sh解析器- 利用
sh直接执行脚本文件 sh 脚本文件- 本质就是使用
sh解析器执行脚本
- 利用
bash解析器- 利用
bash直接执行脚本文件 bash 脚本文件- 本质就是使用
bash解析器执行脚本
- 利用
- 路径执行
./ 脚本文件.sh- 需要脚本文件具有可执行权限,
chmod a+x 脚本文件
区别:
shbash是直接使用对应解析器执行脚本,不需要给脚本文件提权./需要给脚本文件赋权
多行命令
- 在 shell 中可以顺序执行多个命令
示例
#!/bin/bash
touch /root/itheima/one.txt#在这个目录下创建一个 one.txtecho "hello shell" >> /root/itheima/one.txt#将 hello shell 写入 one.txt环境变量
构成
- 变量用于存储管理临时数据在内存中
常用变量:
| 变量名称 | 含义 |
|---|---|
| ==PATH== | 与 windows 环境变量 PATH 功能一样.设置命令的搜索路径,以冒号为分割 |
| HOME | 当前用户主目录: /root |
| SHELL | 当前 shel 解析器类型:/bin/bash |
| ==HISTFILE== | 显示当前用户执行命令的历史列表文件:/root/.bash_history |
| PWD | 显示当前所在路径:/root |
| OLDPWD | 显示之前的路径 |
| HOSTNAME | 显示当前的主机名称 |
| HOSTTYPE | 显示主机的架构,i386|i686|x86|x64 等等 |
| ==LANG== | 设置当前系统的语言环境 |
系统环境变量:
- 系统提供的:Linux 系统的 shell 配置文件中的变量,共享给所有 shell 使用
- 全局配置文件:所有子用户都可以用的变量
/etc/profile/etc/profile.d/*.sh/etc/bashrc
- 个人配置文件:仅当前用户可用
当前用户 /.bash_profile当前用户 /.bashrc
- 全局配置文件:所有子用户都可以用的变量
自定义变量:
分类:
- 局部变量
- 定义:在一个脚本文件中的变量,== 只能在当前脚本中使用的变量 ==
- 语法:
var_name=value变量名 = 值
- 规则:
- == 不能以数字开头 == == 等号两侧不能有空格 ==
- 变量所有的类型都是 == 字符串 == 无法直接参与运算
- 值如果 == 有空格 ==,必须使 == 用双引号 == 括起来
- 不能使用 Shell 关键词作为变量名,如:==NAME== ==PATH== 等
- 查询:
$var_name直接使用变量名查询${var_name}使用花括号查询,== 适合拼接字符串使用 ==
- 删除:
unset var_name
- 常量
- 定义:
- 设置后不可修改,== 常量 == 也叫 == 只读变量 ==
- 语法:
readonly var_name
- 定义:
- 全局变量
- 父子 Shell 环境
- A 脚本中调用 B 脚本,那么 A 脚本环境就是父环境,B 脚本就是子环境
- 语法:
export var_name1 var_name2=value可以同时定义多个变量
- 示例:
- 编辑 demo2.sh
- 定义全局变量 VAR4
- 执行 hemo3.sh
- 编辑 demo3.sh
- 输出全局变量 VAR4
- 执行 demo2.sh
- 编辑 demo2.sh
- 父子 Shell 环境
#!/bin/bashexport VAR4="echowang"sh demo3.sh#!/bin/bashecho "demo3.sh 的变量为 ${VAR4}"特殊符号变量:
$n- 语法:
$n - 含义:接受脚本文件执行时传入的参数
$0用于获取当前脚本名称$1~$9代表获取第一个输入到第九个参数- 第 10 个以上的格式:
${数字}
- 传参语法:
sh 脚本文件 输入参数 1 输入参数 2 ...
- 语法:
$#- 语法:
$# - 含义:获取所有输入参数的个数
- 传参语法:
- 语法:
$*$@- 语法:
$*$@ - 含义:含义都是获取所有输入参数,用于以后输出所有参数
- 区别:
- 不使用双引号括起来,功能是一样的
- 使用双引号
$*获取的所有参数是一个整体,拼接为一个字符串$1$2$3$@获取的所有参数为列表格式:"$1""$2""$3"- 使用循环打印出所有的参数就可以看到区别:
- PRTCL // SHELL
Terminal window for var in #列表变量do #循环开始#命令done#循环结束
- 语法:
$?- 语法:
$? - 含义:用于获取上一个 Shell 的退出状态码,或者函数的返回值
- 每一个 Shell 命令都有一个返回值,这个返回值证明执行是否成功
- 一般返回 0 代表成功
- 语法:
$$- 语法:
$$ - 含义:用于获取当前 Shell 环境的进程 ID
- 语法:
| 特殊变量 | 含义 |
|---|---|
$n | 获取输入参数$0 获取参数名$1 ~ $9 ${11}10 以上的参数使用大括号包围 |
$# | 获取所有参数的个数 |
$* $@ | 获取所有输入参数 区别:在使用双引号的情况下 $* 所有输出参数会拼接成一个字符串$@ 所输出的参数会形成一个列表 |
$? | 获取上一个 Shell 的退出状态码,或者函数返回值,一般来说如果为 0 则代表执行成功 |
$$ | 获取当前 Shell 环境的 PID,每当开启一个 Shell 就会有一个 Shell 的进程 |
查看变量:
- 查看变量
env,可以查看到当前系统的环境变量 set所有的变量,包含系统环境,自定义以及函数
自定义系统环境变量
当用户进入 Shell 环境时,系统初始化会加载这个路径 ==/etc/profile== 下的所有环境变量
案例:
- 编辑 /etc/profile 全局配置文件PRTCL // SHELL
Terminal window #增加命令:定义 VAR1=VAR!,并导出环境变量#VIM 中使用大写的 G 可以快速定位到末尾或者顶端export VAR1=VAR1#环境变量名建议全部大写 - 重载配置文件PRTCL // BASH
Terminal window #每次修改全局环境变量文件后都需要重载source /etc/profile - 在 Shell 环境中读取系统及环境变量 VAR1PRTCL // BASH
Terminal window echo $VAR1
Shell 环境变量 加载流程原理及区别
分类
交互式 Shell
与用户进行交互,用户输出数据,Shell 环境进行反馈
- 日常的 Terminal 都属于交互式 Shell
非交互式 Shell
不需要用户参与,全程自动化
- 不需要用户进行参与的自动化脚本,都属于使用的非交互式 Shell
登录 Shell
需要用户名,密码进行登录的 Shell 环境
- 比如 SSH 这些需要用户名密码进行验证的环境
非登录 Shell
不需要进行登录就可以执行脚本的 Shell 环境
- 不用登录系统级账户就可以访问的业务使用的就是非登录 Shell

橙色为系统全局变量,绿色为用户变量 非登陆环境不会加载 ==/etc/profile==
加载流程测试
切换 Shell 环境执行脚本
在执行一个脚本文件时制定具体 Shell 环境进行执行脚本,这个就是切换 Shell 环境执行脚本
Shell 登录环境执行脚本语法
sh/bash -l/--login 脚本文件含义:先加载 Shell 登录环境流程初始化变量,在执行脚本文件
Shell 非登录环境执行脚本语法
bash #加载 shell 非登录环境sh/bash 脚本文件 #直接执行脚本文件含义:先加载 Shell 非登录初始化环境在执行脚本
- 因为非登陆环境不会加载 ==/etc/profile== ,所以可以通过在这个路径中添加一个变量进行测试
演示:
- 在 ==/etc/profile== 中添加
VAR1=VAR1export VAR1=VAR1` - 在 ==/root/.bashrc== 中添加
VAR2=VAR2export VAR2=VAR2 - 创建
demo1.sh,读取环境变量进行打印
#输出环境变量 VAR1#输出环境变量 VAR2- 以 Shell 非登录环境执行,观察是否只输出 ==VAR2==
- 以 Shell 登录环境执行,观察是否 ==VAR1 ====VAR2== 都会输出
TIPS: 需要登录进行执行的脚本,环境变量配置在 ==/etc/profile== ==/ 当前用户 /.bash_profile== 不需要登录的用户执行的 Shell 脚本环境配置在 ==/ 当前用户 /.bashrc== ==/etc/bashrc==
识别当前是什么 Shell 环境类型
- 语法:
echo $0:- 在 terminal 中如果输出为
-bash为登录环境 - 如果为
bash是非登录环境
- 在 terminal 中如果输出为
字符串变量
单引号:
VAR1='VAR1'- 原样输出,在拼接字符串中使用无效,不解析其中的变量
- PRTCL // SHELL
Terminal window
root@Node3:/home/echowang# VAR2=‘{VAR1} helloworld' root@Node3:/home/echowang# echo VAR2 {VAR1} helloworld #此处的VAR1 是以字符串进行显示,并非 $VAR 变量的值 ```
双引号推荐:
VAR1="VAR1"- 可以用于解析变量值进行拼接,还可以带入子双引号的字符串,但是需要转译
- PRTCL // SHELL
Terminal window
root@Node3:/home/echowang# VAR2=“{VAR1} HEllO World" root@Node3:/home/echowang# echo VAR2 EchoWang HEllO World #此处的 VAR1 为变量的值
root@Node3:/home/echowang# VAR3=""{VAR1}\"Hello World" root@Node3:/home/echowang# echo VAR3 “EchoWang”Hello World #子双引号中为 VAR1 变量的值 ```
- 可以用于解析变量值进行拼接,还可以带入子双引号的字符串,但是需要转译
不用引号:
VAR1=VAR1VAR4=${VAR1} HelloWorld:在变量值的后方添加空格后为执行的命令,没有命令则会报错,所以不建议使用这种方式- PRTCL // SHELL
Terminal window
#下方的 HelloWorld 前方没有空格,所以依然可以赋值 root@Node3:/home/echowang# VAR4={VAR1}HelloWorld root@Node3:/home/echowang# echo VAR4 EchoWangHelloWorld
#在系统中没有 HelloWorld 命令,所以报错,在赋值空格的后方,是需要执行的命令 root@Node3:/home/echowang# VAR4=${VAR1} HelloWorld HelloWorld: command not found root@Node3:/home/echowang#
### 打印字符串的长度`${#var_name}````shellroot@Node3:/home/echowang# echo $VAR1EchoWang #VAR 的值root@Node3:/home/echowang# echo ${#VAR1}8 #VAR 变量的字符串长度拼接
- 无符号拼接PRTCL // SHELL
Terminal window
root@Node3:/home/echowang# var1=abc root@Node3:/home/echowang# var2=“hello world”
root@Node3:/home/echowang# var3={var2} #此处不使用任何符号进行拼接
root@Node3:/home/echowang# echo $var3 abchello world 2. ** 双引号拼接 ** 最推荐shell root@Node3:/home/echowang# var1=abc root@Node3:/home/echowang# var2=” Hello World”
root@Node3:/home/echowang# var3=“{var2}” #此处使用双引号进行拼接
root@Node3:/home/echowang# echo $var3 abc Hello World
```3. 混合拼接 ```bash root@Node3:/home/echowang# var1=echo root@Node3:/home/echowang# var2=” Hello World”
root@Node3:/home/echowang# var3={var1}'&'{var2}”+”${VAR1} #此处使用混合拼接,中间的符号使用 ‘单引号’ “双引号” 括起来
root@Node3:/home/echowang# echo $var3 echo& Hello World+EchoWang
root@Node3:/home/echowang# echo “Hi I am” $var1 Hi I am echo
```字符串截取
| 格式 | 含义 |
|---|---|
${var_name:start:lenth} | 截取start和lenth之间的所有字符 |
${var_name:start} | 从start字符开始向后截取所有字符 |
${var_name:0-start:lenth} | 0-start 从后方往前截取到start的字符,取lenth 个字符 |
${ var_name:0-start} | 0-start 从后方start开始截取从 0 到start的所有字符 |
${var_name#*chars} | 从左向右,截取第一个chars字符后方的所有字符,不包含chars |
${var_name##*chars} | 从右向左,截取第一个chars字符后方的所有字符,不包含chars |
${var_name%chars*} | 从左到右,以最后一个chars为截止字符,不包含chars |
${var_name%%chars*} | 从右到左,以最后一个chars为截止字符,不包含chars |
索引数组变量:
定义:
语法:
在 Shell 中用 ==()== 表示数组,数组之间用 == 空格 == 来分隔,和代码语言中的字典类似
array_name=(item1 item2 ...)#方式 1,按照顺序默认排序array_name=([索引下标 1]=item1 [索引下标 2]=item2 ...)#方式 2,可以自定义数组中值的索引序号注意:赋值 == 等号 == 两边不能存在空格
获取
语法:
- 通过下标索引到对应的值,index 从序号0开始
${arr[index]}
- 将获取值赋值给其他变量
item=$arr[index]}
- 使用
@*可以获取数组中的所有元素${arr[@]${arr[*]
- 获取数组的长度或者个数
${#arr[@]}${#arr[*]}
- 获取数组制定元素的字符长度
${#arr[索引]}
拼接:
语法:
array_new=(${array1[@] ${array2[@]} ...) array_new=(${array1[*] ${array2[*]} ...)
删除
语法:
删除制定元素: unset array_name[index]
index对应需要删除值的索引下标 删除整个数组:unset array_name
内置命令 :
内置命令 常用的
| 命令 | 含义 |
|---|---|
alias | 直接使用是列出当前资源下所有的别名设置alias[别名]=[指令名称] 把很长的命令指定一个别名以便快速使用 |
echo | 输出字符串echo [选项] [字符串] |
read | |
exit | |
declare |
alias 设置别名
介绍:
Bash Shell 内置的命令,不是系统中可以执行的脚本文件
tyle 命令 可以查看是否是内置命令
root@Node3:/home/echowang# type crontabcrontab is /usr/bin/crontab #这就是一个脚本文件,显示的是路径root@Node3:/home/echowang# type cdcd is a shell builtin #这就是内置命令脚本文件会在磁盘中索引,比内置命令更慢
删除
unalias 别名 :删除指定别名 unalias -a :删除所有别名
都是临时删除,永久删除需要在文件中删除
echo 输出字符串
默认输出的字符串是换行的 如果需要输出不换行字符,需要添加
-n
| 转义序列 | 说明 |
|---|---|
\c | 清除结尾换行符 |
\n | 换行 |
\t | 水平制表符 |
\v | 垂直制表符 |
\b | 退格 |
\r | 回车 |
\\ | 反斜杠字符本身 |
如果需要添加转义符,需要添加
-e
read 读取控制台输入
介绍:
read 是 Shell 内置命令,用于读取数据并赋值给变量,若没有重定向,默认从终端控制台读取用户数据,若重定向,则是从定向文件中读取数据。
语法:
read [-ers] [-a aname] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [name ...]:-a后跟一个变量,该变量会被认为是个数组,然后给其赋值,默认是以空格为分割符。-d后面跟一个标志符,其实只有其后的第一个字符有用,作为结束的标志。-p后面跟提示信息,即在输入前打印提示信息。-e在输入的时候可以使用命令补全功能。-n后跟一个数字,定义输入文本的长度,很实用。-r屏蔽\,如果没有该选项,则\作为一个转义字符,有的话 \就是个正常的字符了。-s安静模式,在输入字符时不再屏幕上显示,例如 login 时输入密码。-t后面跟秒数,定义输入字符的等待时间。-u后面跟 fd,从文件描述符中读入,该文件描述符可以是 exec 新开启的。 直接输入read默认会将输入的值存储在$REPLY这个变量当中
仅读取一个字符:一般用于 y/n
read -n 1 -p "您是否要删除 (y/n)" charprintf "\n" #添加换行符用于限制用户输入字符长度echo ${char}限制输入时间及静默输入
#!/bin/bash#第一次输入密码,-s 添加静默输入 -p 添加提示read -s -t 20 -p "请输入你的密码 (20s 内 )" pwd1
printf "\n"#第二次输入密码,-s 添加静默输入 -p 添加提示read -s -t 20 -p "再次输入您的密码 (20s)" pwd2
printf "\n"#检查两次密码是否一致#使用 if 语句添加判断条件if [ $pwd1 == $pwd2 ]then echo "密已设置完成"else echo "密码验证失败,两次不一致"fiexit 退出
exit用于退出当前 Shell 环境并结束运行,且返回一个状态码,可以用$?获取到状态码 返回0代表命令执行成功
在脚本文件中,可以编辑多个不同的exit返回状态码,用于反馈脚本执行状态。
declare 设置变量
可用来声明变量并设置变量的属性 ([rix]即为变量的属性) 可用来显示 shell 函数。若不加上任何参数,则会显示全部的 shell 变量与函数 ( 与执行 set 指令的效果相同 )。
declare [+/-][rxi][变量名称=设置值] 或 declare -f- +/-:-可用来指定变量的属性,+则是取消变量所设的属性。a: ==array== 设置为普通索引数组A: ==Array== 设置为 key-value 关联数组-f: ==function== 仅显示函数。r: ==readonly== 将变量设置为只读。x: ==export== 指定的变量会成为环境变量,可供 shell 以外的程序来使用。i: ==int== 可以是数值,字符串或运算式。
Auth_Verified: 2026.04.06
