当前位置: 首页 > news >正文

Shell编程规范与变量:详解环境变量、位置变量与预定义变量


文章目录

    • 环境变量、位置变量与预定义变量
      • 环境变量
      • 位置变量(Positional Variables)
      • 预定义变量(和双引号的用法)


环境变量、位置变量与预定义变量

环境变量

由系统维护,用于设置工作环境、配置系统行为、传递信息和控制程序的执行。

  • 系统级环境变量: 这些变量对整个操作系统及其所有用户都是可见的。

    例如,PATH变量存储了操作系统查找可执行文件的路径列表。

  • 用户级环境变量: 这些变量只对当前用户可见。每个用户可以定义自己的环境变量,用于满足个人需求。

    例如,HOME变量指定了当前用户的主目录路径。

  • 预定义环境变量: 操作系统或应用程序预先定义了一些常用的环境变量,用于提供特定的信息和功能。

    例如,USER变量保存当前用户名,LANG变量指定了当前系统的默认语言。

  • 自定义环境变量: 用户和应用程序可以定义自己的环境变量,用于存储特定的信息或配置。

    这些变量可以根据需要随时创建、修改和删除。

常用变量

  • $USER 表示用户名称
  • $HOME 表示用户的宿主目录
  • $LANG 表示语言和字符集
  • $PWD 表示当前所在工作目录
  • $PATH 表示可执行用户程序的默认路径

示例

echo $PATH					      # 查看当前搜索路径
PATH="$PATH:/root"	  	  # 将/root目录添加到搜索路径
export PATH="$PATH:/root"	# 输出为全局环境变量[root@localhost ~]# chmod 777 123.sh # 给执行权限
[root@localhost ~]# 123.sh   # 可以直接打印

位置变量(Positional Variables)

也称为命令行参数(Command-Line Arguments),位置变量是在运行脚本或程序时传递的值,用于将外部数据传递给脚本或程序,以便根据需要进行处理。

当执行命令行操作时,第一个字段表示命令名或脚本程序名,其余的字符串参数按照从左到右的顺序依次赋值给位置变量。

  • 格式$n (n为数字)
    • $0:表示命令本身。

    • $1-$9:表示第一个到第九个参数,十以上的参数使用大括号表示,例如 ${10}

    • 示例

      vim addnum.shnum1=$1
      num2=$2
      sum=$(($num1 + $num2))
      echo $sum./addnum.sh 12 34
      # $0        $1 $2
      

预定义变量(和双引号的用法)

预定义变量由编程语言或脚本解释器提供,并根据需要自动设置和更新,不能修改。

  • 常见预定义变量

    • $*、$@:表示命令或脚本要处理的参数。

    • $*:所有参数看成以空格分隔的一个字符串整体(单字符串)返回,代表”$1 $2 $3 $4“。

    • $@:各个参数加上双引号分隔成n份的参数列表返回,每个参数作为一个字符串返回,代表"$1" “$2” “$3” “$4”。

    • $0:表示当前执行的脚本或命令的名称。

    • $#:表示参数的个数。

    • $?:表示前一条命令或脚本执行后的返回状态码,返回值为0表示执行正确,返回任何非0值均表示执行出现异常。也常被用于Shell脚本中return退出函数并返回的退出值。

    • 示例

      echo "输入的对象数为: $#"
      
  • $*加引号:

    vim test.sh
    #!/bin/bashfunction print_args {for arg in "$*"; doecho "$arg"done
    }print_args "Hello" "World" "!"
    #函数将只输出一个字符串“Hello World !”
    
  • $*不加引号:

    #!/bin/bashfunction print_args {for arg in $*; doecho "$arg"done
    }print_args "Hello" "World" "!"
    #函数将分别输出三个字符串“Hello”、“World”和“!”
    
  • $* 和 $@ 的用法:

    ∗ 、 *、 @不加双引号时表现一致;加双引号时,$*会将所有参数作为一个整体。

    function print_args_star {for arg in "$*"; doecho "$arg"done
    }function print_args_at {for arg in "$@"; doecho "$arg"done
    }print_args_star "Hello" "World" "!"
    echo "--------"
    print_args_at "Hello" "World" "!"# 输出:
    # Hello World ! 
    # --------
    # Hello
    # World
    # !
    
  • $# 的用法:

    $#是一个特殊的全局变量,它表示传递给当前脚本或函数的参数个数。

    [root@localhost ~]# vim test.sh
    #!/bin/bashecho "输入的对象数为: $#"[root@localhost ~]# sh test.sh 1 2 3 4 5 6
    输入的对象数为: 6
    
  • $? 的用法:

    表示前一条命令或脚本执行后的返回状态码,返回值为0表示执行正确,
    返回任何非0值均表示执行出现异常。也常被用于Shell脚本中return退出函数并返回的退出值。

    vim test.sh
    read -p "请输入第一个比较的数据:" a
    read -p "请输入第二个比较的数据:" b
    if [ $a == $b ]
    then
    echo "right"
    else
    echo $?
    fi
    [root@client ~]# ./b.sh 
    请输入第一个比较的数据:abc
    请输入第二个比较的数据:abc
    right
    

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Java 入门指南:Java IO流 —— 序列化与反序列化
  • centos7 xtrabackup mysql(8)压缩 全量备份 还原(4)
  • 加速网络体验,Squid缓存代理:让浏览如飞,畅享无限网络速度!
  • 计算机专业的真正的就业情况
  • C语言 | Leetcode C语言题解之第375题猜数字大小II
  • 02-03:原理图与PCB交互以及快速模块化
  • E - Red Polyomino 关于回溯 和爆搜
  • 入门STM32--按键输入
  • 排队辅助功能二手车,全速自适应巡航
  • 适应CLIP作为图像去雾的聚合指导
  • 现在的ai是否和当年的5g一样被夸大了
  • 大模型日报 2024-08-24
  • 初识数据库
  • PG_RMAN 部署与使用
  • GB28181协议设备为何越来越受青睐?
  • [ JavaScript ] 数据结构与算法 —— 链表
  • Android优雅地处理按钮重复点击
  • Brief introduction of how to 'Call, Apply and Bind'
  • C++入门教程(10):for 语句
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • CSS3 变换
  • CSS魔法堂:Absolute Positioning就这个样
  • GitUp, 你不可错过的秀外慧中的git工具
  • Invalidate和postInvalidate的区别
  • JavaScript工作原理(五):深入了解WebSockets,HTTP/2和SSE,以及如何选择
  • java第三方包学习之lombok
  • Laravel Mix运行时关于es2015报错解决方案
  • October CMS - 快速入门 9 Images And Galleries
  • pdf文件如何在线转换为jpg图片
  • React系列之 Redux 架构模式
  • Spring Cloud中负载均衡器概览
  • Vue2.0 实现互斥
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 类orAPI - 收藏集 - 掘金
  • 前嗅ForeSpider中数据浏览界面介绍
  • 使用Gradle第一次构建Java程序
  • 想使用 MongoDB ,你应该了解这8个方面!
  • 异步
  • puppet连载22:define用法
  • ​Spring Boot 分片上传文件
  • ​卜东波研究员:高观点下的少儿计算思维
  • $(function(){})与(function($){....})(jQuery)的区别
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (23)Linux的软硬连接
  • (9)目标检测_SSD的原理
  • (k8s)Kubernetes 从0到1容器编排之旅
  • (ZT)薛涌:谈贫说富
  • (不用互三)AI绘画:科技赋能艺术的崭新时代
  • (五)Python 垃圾回收机制
  • (一)appium-desktop定位元素原理
  • (转)EOS中账户、钱包和密钥的关系
  • (转)mysql使用Navicat 导出和导入数据库
  • .Net Redis的秒杀Dome和异步执行
  • .net Stream篇(六)
  • .Net 中Partitioner static与dynamic的性能对比