Shell脚本基础(2):环境变量、位置变量与运算符

内容预览 ≧∀≦ゞ

  • Shell 脚本基础(2):环境变量、位置变量与运算符
    • 声明
    • 环境变量
      • 什么是环境变量?
      • 如何配置环境变量PATH?
        • 方法 1:将脚本移动到环境变量目录
        • 方法 2:将自定义目录添加到环境变量
    • 位置变量
      • 什么是位置变量?
      • 使用位置变量进行参数传递
    • 运算符
      • 算术运算符
      • 逻辑运算符
      • 字符串运算符
    • 小结

Shell 脚本基础(2):环境变量、位置变量与运算符


声明

笔记内容参考了B站UP主 泷羽sec 的学习视频,如有侵权,将立即删除。

本笔记旨在促进网络安全学习,任何不当使用均与作者无关,请勿逾越法律红线,否则后果自负。

希望这些内容能对各位师傅有所帮助,欢迎您的点赞和评论!


环境变量

什么是环境变量?

在上一节中,我们讨论了 临时变量 的使用,它们仅在当前 Shell 会话中有效,关闭 Shell 后就会失效。那么,什么是 环境变量 呢?

环境变量 是操作系统中的全局变量,它们的作用范围不仅限于当前 Shell,还可以被该 Shell 启动的所有子进程继承。

相比临时变量,环境变量是 全局性、长期性 的,能有效地将配置信息传递给相关程序或脚本。

以下是一些常见的环境变量及其用途:

  • $PATH:定义可执行文件的搜索路径。
  • $HOME:当前用户的主目录路径。
  • $PWD:当前工作目录路径。
  • $SHELL:当前使用的 Shell 程序路径。
  • $USER:当前登录用户的用户名。
  • $LANG:系统语言和字符编码设置。

如何配置环境变量PATH?

在 Windows 系统中,命令提示符可以直接运行 pingnotepad 等命令,是因为 $PATH 环境变量中包含了这些命令所在的目录。Linux 系统也采用类似机制,执行ls等命令时,等同于输入/usr/bin/ls。如果希望自定义脚本可以像系统命令一样直接运行,可以通过以下两种方法实现。

方法 1:将脚本移动到环境变量目录
  1. 查看环境变量目录
    $PATH 中定义的目录是系统搜索可执行程序的路径集合,可通过以下命令查看:

    bash 复制代码
    echo $PATH

    结果显示多个路径,使用冒号分隔,例如:

    plaintext 复制代码
    /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/home/user/bin
  2. 验证命令路径

    使用 which 命令查看命令的路径:

    bash 复制代码
    which ls

    输出 /usr/bin/ls,说明 ls 命令在 /usr/bin 目录下。

  3. 移动脚本到环境变量目录

    将自定义脚本移动到 $PATH 中的目录(如 /usr/local/bin):

    bash 复制代码
    chmod +x your_script.sh
    mv your_script.sh /usr/local/bin/

    这样,脚本就可以直接通过文件名运行。

方法 2:将自定义目录添加到环境变量

如果希望脚本保留在自定义目录中,可以将该目录加入 $PATH

  1. 临时添加路径

    使用 export 命令:

    bash 复制代码
    export PATH=/your/script/directory:$PATH

    这行命令将 /your/script/directory 添加到现有的 $PATH 变量前端。通过 $PATH 的值扩展,系统在搜索命令时会优先检查新添加的目录。
    注意:此设置仅在当前会话中有效。

  2. 永久添加路径

    编辑 Shell 的配置文件(如 .bashrc):

    bash 复制代码
    echo 'export PATH=/your/script/directory:$PATH' >> ~/.bashrc
    source ~/.bashrc
  3. 示例:运行脚本

    bash 复制代码
    echo "echo Hello World" > hello.sh
    chmod +x hello.sh
    export PATH=$(pwd):$PATH
    hello.sh

位置变量

什么是位置变量?

Shell 脚本支持从命令行接收参数,位置变量是用于存储这些参数的特殊变量。它们使脚本能够动态处理不同的输入。

以下是一些常见位置变量及其用途:

  • $0:当前脚本的文件名(包含路径)。
  • $1$2...$n:命令行传递的第 1、2...n 个参数。
  • $*:以单个字符串显示所有参数。
  • $@:以独立的字符串形式显示所有参数。
  • $#:传递的参数个数。
  • $?:上一条命令的退出状态码(0 表示成功)。
  • $$:当前运行脚本的进程 ID。

使用位置变量进行参数传递

编写脚本 params.sh

bash 复制代码
echo "脚本名:$0"
echo "第一个参数:$1"
echo "所有参数(字符串):$*"
echo "所有参数(独立):$@"
echo "参数个数:$#"

运行脚本:

bash 复制代码
sh params.sh arg1 arg2

输出结果:

plaintext 复制代码
脚本名:params.sh
第一个参数:arg1
所有参数(字符串):arg1 arg2
所有参数(独立):arg1 arg2
参数个数:2

运算符

算术运算符

在 Shell 中进行算术运算时,运算符前后必须留有空格 ,且某些特殊字符(如 *)需要转义。这是因为 Shell 使用空格作为命令和参数的分隔符,同时对某些符号具有特殊含义,因此必须严格按照语法规则操作。

以下是详细解释:

  1. 运算符前后需有空格

    Shell 中的 expr 命令会将每个部分(运算数和运算符)作为独立的参数解析,因此必须确保运算符前后有空格。例如:

    bash 复制代码
    expr 1 + 2  # 正确
    expr 1+2    # 错误

    如果没有空格,Shell 会将整个表达式视为一个字符串,而非分离的参数,从而导致解析错误。

  2. 括号、星号等特殊字符需转义

    • *(星号)是 Shell 中的通配符,用于匹配文件名。因此,在算术运算中使用 * 表示乘法时,必须进行转义:

      bash 复制代码
      expr 5 \* 3  # 正确
      expr 5 * 3   # 错误,未转义的 * 被解析为通配符
    • 其他特殊字符,如 ()|& 等,也可能需要转义,具体取决于上下文中的含义。例如,括号通常用于分组运算,但未经转义时可能会触发子 Shell 的执行。

  3. 关于 Shell 的算术解析规则

    Shell 中许多运算工具(如 expr$((..))let)依赖不同的解析方式。例如:

    • expr 是一个命令,需要通过命令参数传递表达式,因此空格和转义是必要的。

    • $((..)) 内部则不需要转义或空格,写法更简洁:

      bash 复制代码
      result=$((5 * 3))  # 正确,乘法无需转义
    • let$((..)) 类似,操作符无需转义,但也需注意空格:

      bash 复制代码
      let "result = 5 * 3"  # 正确

逻辑运算符

Shell 支持以下逻辑运算符,常用于条件判断:

  • &&:逻辑与
  • ||:逻辑或
  • !:逻辑非

以下为运用逻辑运算符进行条件判断的示例:

bash 复制代码
if [ -d /tmp ] && [ -w /tmp ]; then
  echo "/tmp 存在且可写"
else
  echo "/tmp 不存在或不可写"
fi

字符串运算符

Shell 提供多种用于操作和比较字符串的运算符:

  1. 获取字符串长度

    bash 复制代码
    str="hello"
    echo ${#str}  # 输出 5
  2. 字符串截取

    bash 复制代码
    echo ${str:1:3}  # 输出 ell,从索引 1 开始截取 3 个字符
  3. 字符串比较

    • =:判断字符串是否相等。
    • !=:判断字符串是否不相等。
    bash 复制代码
    if [ "$str" = "hello" ]; then
      echo "字符串相等"
    fi

小结

通过掌握环境变量、位置变量与运算符的用法,可以大幅提升 Shell 脚本编写效率,同时更深入地理解操作系统的运行机制。无论是自动化任务还是系统管理,灵活使用这些工具都是成功的关键。

最后,再次感谢您阅读本篇文章,如果您对文中内容有任何疑问或建议,欢迎在评论区与我交流!您的点赞和分享将是我继续创作的动力。

相关推荐
雪碧聊技术10 分钟前
linux(centos7)如何执行python脚本
linux·python3·爬虫脚本·linux安装python3·linux运行爬虫脚本
lbb 小魔仙11 分钟前
Ubuntu 22.04 安装 Docker 完整步骤(附镜像加速配置)
linux·ubuntu·docker
Full Stack Developme3 小时前
Linux 多种压缩格式,优缺点和适用场景
linux·运维·服务器
旖旎夜光3 小时前
Linux(4)(下)
linux·学习
Shanxun Liao8 小时前
Cenots 7.9 配置多台 SSH 互信登陆免密码
linux·运维·ssh
j_xxx404_8 小时前
Linux:第一个程序--进度条|区分回车与换行|行缓冲区|进度条代码两个版本|代码测试与优化
linux·运维·服务器
looking_for__8 小时前
【Linux】Ext系列文件系统
linux
OliverH-yishuihan9 小时前
开发linux项目-在 Windows 上 基于“适用于 Linux 的 Windows 子系统(WSL)”
linux·c++·windows
南棱笑笑生11 小时前
20251224给飞凌OK3588-C开发板适配Rockchip原厂的Buildroot【linux-6.1】系统时确认ssh服务【内置dropbear】
linux·c语言·ssh·rockchip
I · T · LUCKYBOOM11 小时前
30.Firewalld-Linux
linux·运维·安全