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 脚本编写效率,同时更深入地理解操作系统的运行机制。无论是自动化任务还是系统管理,灵活使用这些工具都是成功的关键。

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

相关推荐
CSND7401 小时前
Ubuntu vi(vim)编辑器配置一键补全main函数
linux·c语言·ubuntu·编辑器·vim
シ風箏4 小时前
Neo4j【环境部署 02】图形数据库Neo4j在Linux系统ARM架构下的安装使用
linux·数据库·arm·neo4j
Cachel wood6 小时前
Vue.js前端框架教程8:Vue消息提示ElMessage和ElMessageBox
linux·前端·javascript·vue.js·前端框架·ecmascript
小屁不止是运维9 小时前
麒麟操作系统服务架构保姆级教程(二)ssh远程连接
linux·运维·服务器·学习·架构·ssh
超爱吃士力架10 小时前
Ubuntu操作系统安装docker
linux·前端·后端
黑客K-ing11 小时前
网络安全防范
linux·服务器·web安全
王三三11 小时前
群晖利用acme.sh自动申请证书并且自动重载证书的问题解决
linux·自动化·证书·群晖·acme·acme.sh·lets encrypt
路飞雪吖~11 小时前
【Linux】进程控制
linux·运维·服务器
wy02_11 小时前
Linux基本命令
linux·运维
qq_4592384911 小时前
Linux之压缩解压相关命令
linux