复制成功
请遵守本站许可
REPORT
Chapter_Post // Field_Report

Post_Ref: RL-SHELL学习路

2026.04.06

Shell

Echo HaoRan
Echo HaoRan
#StudyProject
ANALYSIS

格式与执行方式#

注释#

  • 单行注释
PRTCL // SHELL
Terminal window
#注释内容
  • 多行注释
PRTCL // SHELL
Terminal window
:<<!
#注释内容
#注释内容
!

解释器#

  • 意义在告诉脚本使用什么解释器
PRTCL // SHELL
#!/bin/bash

执行方式#

  1. sh 解析器
    1. 利用sh直接执行脚本文件
    2. sh 脚本文件
    3. 本质就是使用sh解析器执行脚本
  2. bash解析器
    1. 利用bash直接执行脚本文件
    2. bash 脚本文件
    3. 本质就是使用bash解析器执行脚本
  3. 路径执行
    1. ./ 脚本文件.sh
    2. 需要脚本文件具有可执行权限,chmod a+x 脚本文件

区别:#

  • sh bash 是直接使用对应解析器执行脚本,不需要给脚本文件提权
  • ./ 需要给脚本文件赋权

多行命令#

  • 在 shell 中可以顺序执行多个命令

示例#

PRTCL // SHELL
#!/bin/bash
touch /root/itheima/one.txt
#在这个目录下创建一个 one.txt
echo "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==设置当前系统的语言环境UTF-8

系统环境变量:#

  1. 系统提供的: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
        1. 定义全局变量 VAR4
        2. 执行 hemo3.sh
      • 编辑 demo3.sh
        1. 输出全局变量 VAR4
      • 执行 demo2.sh
PRTCL // SHELL
demo2.sh
#!/bin/bash
export VAR4="echowang"
sh demo3.sh
PRTCL // PLAINTEXT
demo3.sh
#!/bin/bash
echo "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== 下的所有环境变量

案例:#

  1. 编辑 /etc/profile 全局配置文件
    PRTCL // SHELL
    Terminal window
    #增加命令:定义 VAR1=VAR!,并导出环境变量
    #VIM 中使用大写的 G 可以快速定位到末尾或者顶端
    export VAR1=VAR1
    #环境变量名建议全部大写
  2. 重载配置文件
    PRTCL // BASH
    Terminal window
    #每次修改全局环境变量文件后都需要重载
    source /etc/profile
  3. 在 Shell 环境中读取系统及环境变量 VAR1
    PRTCL // BASH
    Terminal window
    echo $VAR1

Shell 环境变量 加载流程原理及区别#

分类#

交互式 Shell#

与用户进行交互,用户输出数据,Shell 环境进行反馈

  • 日常的 Terminal 都属于交互式 Shell

非交互式 Shell#

不需要用户参与,全程自动化

  • 不需要用户进行参与的自动化脚本,都属于使用的非交互式 Shell

登录 Shell#

需要用户名,密码进行登录的 Shell 环境

  • 比如 SSH 这些需要用户名密码进行验证的环境

非登录 Shell#

不需要进行登录就可以执行脚本的 Shell 环境

  • 不用登录系统级账户就可以访问的业务使用的就是非登录 Shell

file-20251130112335046

橙色为系统全局变量,绿色为用户变量 非登陆环境不会加载 ==/etc/profile==

加载流程测试#

切换 Shell 环境执行脚本#

在执行一个脚本文件时制定具体 Shell 环境进行执行脚本,这个就是切换 Shell 环境执行脚本

Shell 登录环境执行脚本语法#

PRTCL // BASH
Terminal window
sh/bash -l/--login 脚本文件

含义:先加载 Shell 登录环境流程初始化变量,在执行脚本文件

Shell 非登录环境执行脚本语法#

PRTCL // BASH
Terminal window
bash #加载 shell 非登录环境
sh/bash 脚本文件 #直接执行脚本文件

含义:先加载 Shell 非登录初始化环境在执行脚本

  • 因为非登陆环境不会加载 ==/etc/profile== ,所以可以通过在这个路径中添加一个变量进行测试
演示:#
  1. 在 ==/etc/profile== 中添加VAR1=VAR1export VAR1=VAR1`
  2. 在 ==/root/.bashrc== 中添加VAR2=VAR2 export VAR2=VAR2
  3. 创建demo1.sh,读取环境变量进行打印
PRTCL // SHELL
Terminal window
#输出环境变量 VAR1
#输出环境变量 VAR2
  1. 以 Shell 非登录环境执行,观察是否只输出 ==VAR2==
  2. 以 Shell 登录环境执行,观察是否 ==VAR1 ====VAR2== 都会输出

TIPS: 需要登录进行执行的脚本,环境变量配置在 ==/etc/profile== ==/ 当前用户 /.bash_profile== 不需要登录的用户执行的 Shell 脚本环境配置在 ==/ 当前用户 /.bashrc== ==/etc/bashrc==

识别当前是什么 Shell 环境类型#

  • 语法:
    • echo $0
      • 在 terminal 中如果输出为 -bash 为登录环境
      • 如果为bash是非登录环境

字符串变量#

  • 单引号: 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=VAR1

    • VAR4=${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#

PRTCL // PLAINTEXT
### 打印字符串的长度
`${#var_name}`
```shell
root@Node3:/home/echowang# echo $VAR1
EchoWang #VAR 的值
root@Node3:/home/echowang# echo ${#VAR1}
8 #VAR 变量的字符串长度

拼接#

  1. 无符号拼接
    PRTCL // SHELL
    Terminal window

root@Node3:/home/echowang# var1=abc root@Node3:/home/echowang# var2=“hello world”

root@Node3:/home/echowang# var3=var1{var1}{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=“var1{var1}{var2}” #此处使用双引号进行拼接

root@Node3:/home/echowang# echo $var3 abc Hello World

PRTCL // PLAINTEXT
```

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

PRTCL // PLAINTEXT
```

字符串截取#

格式含义
${var_name:start:lenth}截取startlenth之间的所有字符
${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 中用 ==()== 表示数组,数组之间用 == 空格 == 来分隔,和代码语言中的字典类似

PRTCL // SHELL
Terminal window
array_name=(item1 item2 ...)#方式 1,按照顺序默认排序
array_name=([索引下标 1]=item1 [索引下标 2]=item2 ...)#方式 2,可以自定义数组中值的索引序号

注意:赋值 == 等号 == 两边不能存在空格

获取#

语法:#
  1. 通过下标索引到对应的值,index 从序号0开始
    1. ${arr[index]}
  2. 将获取值赋值给其他变量
    1. item=$arr[index]}
  3. 使用 @ * 可以获取数组中的所有元素
    1. ${arr[@]
    2. ${arr[*]
  4. 获取数组的长度或者个数
    1. ${#arr[@]}
    2. ${#arr[*]}
  5. 获取数组制定元素的字符长度
    1. ${#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 命令 可以查看是否是内置命令

PRTCL // SHELL
Terminal window
root@Node3:/home/echowang# type crontab
crontab is /usr/bin/crontab #这就是一个脚本文件,显示的是路径
root@Node3:/home/echowang# type cd
cd 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#

PRTCL // SHELL
/bin/bash
read -n 1 -p "您是否要删除 (y/n)" char
printf "\n" #添加换行符用于限制用户输入字符长度
echo ${char}

限制输入时间及静默输入#

PRTCL // SHELL
#!/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 "密码验证失败,两次不一致"
fi

exit 退出#

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== 可以是数值,字符串或运算式。
R P
Rhine Lab Pioneer Division
Auth_Verified: 2026.04.06
// END OF POST

订阅

通过 RSS 订阅本站,新文章发布时第一时间收到通知。

Follow
Classified
Chapter_06
Protocol_Ref: CC-BY-NC-SA-4.0

Shell

Author: CHONGXIReleased: 2026.04.06

Licensed under CC BY-NC-SA 4.0

评论

© 2025-2026 EchoSpace
Powered by Astro & echohaoran Non-Collaborative_Entity // Protocol_V.4.21