Shell 脚本中的变量

2023-05-16

文章目录

  • 1 变量概述
    • 1.1 变量类型
    • 1.2 变量的命名要求
    • 1.3 变量作用范围
  • 2 局部变量
  • 3 环境变量
    • 3.1 系统内置环境变量
    • 3.2 环境变量的配置文件
  • 4 只读变量
  • 5 位置变量

1 变量概述

变量即在程序运行过程中它的值是允许改变的量。
变量是用一串固定的字符串去表示不固定的内容。
变量表示命令的内存空间,将数据放在内存空间中,通过变量名引用,获取数据。

变量的作用:
用来存放系统和用户需要使用的特定参数(值)。

  • 变量名:使用固定的名称,由系统预设或用户定义。
  • 变量值:能够根据用户设置、系统环境的变化而变化。

1.1 变量类型

变量赋值: 变量名=变量值(name=value)

bash变量类型:
1、根据变量的生效范围可分为:

  • 环境变量(全局变量):全局生效,在任何bash环境中都可以识别。

  • 局部变量:生效范围为当前shell进程。对当前shell之外的其它shell进程,包括当前shell的子shell进程均无效。

  • 本地变量:生效范围为当前shell进程中某代码片断,通常指函数。 只能在定义它们的函数/脚本内部中使用。

2、根据是否由系统定义可分为:

  • 内置变量:由系统维护,用于设置工作环境。如PS1,PATH,HISTSIZE, HOSTNAME,USER。
  • 自定义变量:由用户自己定义、修改和使用。

3、特殊变量:

    • 环境变量(全局变量):全局生效,在任何bash环境中都可以识别。:
  • 只读变量:read only, 只可以读取不可以更改 。

  • 位置变量: 通过命令行给脚本传递参数 。n(n是正整数),n(n是正整数),n(n是正整数),{10} 要加花括号。

  • 预定义变量:用来保持脚本程序的执行信息。

    • $0 :当前脚本名称(如果是软链接,显示当前软链接文件名)。
    • $? :查看上一次命令的执行状态,返回0为正常,非0为错误。
    • $* :返回所有参数,当整体返回。
    • $@ :返回所有参数,当个体返回。
    • $# :获取当前shell命令行中参数的总个数。
    • $_ :在此之前执行的命令或脚本的最后一个参数。
    • $$ :获取当前进程的PID。

1.2 变量的命名要求

  • 区分大小写
  • 不能使程序中的保留字和内置变量名称:如:if, for,hostname。
  • 只能使用数字、字母及下划线,且不能以数字开头,注意:不支持短横线 “ - ”,和主机名相反。
  • 使用英文时,尽量使用词义通俗易懂,如PATH。
  • 大驼峰 StudentFirstName
  • 小驼峰 studentFirstName
  • 下划线 student_name

1.3 变量作用范围

默认情况下,新定义的变量只在当前的shell环境中有效,因此称为局部变量,当进入子程序或新的shell环境中,局部变量将无法再起作用。

可以通过内部命令export将指定的变量为全局变量(即环境变量),使用户定义的变量在所有子shell环境中可以继续使用。

方法:

方法一,设置全局变量:

export name=value或 declare -x name=value

方法二,将局部变量转变为全局变量:export name

步骤1、先设置一个局部变量color,使用bash命令进入子shell环境,查看变量是否有效;

步骤2、之后使用export命令将局部变量转换为环境变量,进入子shell环境,查看变量是否有效。

 # 设置局部变量color
 [root@localhost ~]# color=red         //设置局部变量color
 [root@localhost ~]# echo $color
 red
 [root@localhost ~]# bash              //进入子shell环境
 [root@localhost ~]# echo $color       //查看变量color,为空,无效
 ​
 [root@localhost ~]# exit              //退出当前shell,返回上一级shell环境
 exit
 ​
 # 将局部变量color转换为全局变量
 [root@localhost ~]# export color     //将局部变量color转换为全局变量
 [root@localhost ~]# bash             //进入子shell环境
 [root@localhost ~]# echo $color      //查看变量color,有效
 red

2 局部变量

定义变量: 变量名=变量值
引用变量: $变量名 或 ${变量名}
查看变量

echo $变量名:查看单个变量
set:查看所有变量,包括局部变量和环境变量

取消变量: unset 变量名
作用范围: 仅在当前shell环境中有效,无法在子shell环境中使用。

3 环境变量

3.1 系统内置环境变量

1、由系统提前创建,用来设置用户的工作环境。

2、使用env命令查看所有环境变量:

 [root@localhost ~]# env    //查看所有环境变量,这里只截取部分进行展示
 XDG_SESSION_ID=1
 HOSTNAME=localhost.localdomain
 SELINUX_ROLE_REQUESTED=
 TERM=xterm
 SHELL=/bin/bash
 HISTSIZE=1000
 SSH_CLIENT=192.168.72.100 55445 22
 SELINUX_USE_CURRENT_RANGE=
 SSH_TTY=/dev/pts/0
 USER=root

3、需要记住的常用环境变量:

  • $PATH 表示可执行文件的默认路径

  • $USER 表示用户名称

  • $HOME 表示用户的宿主目录

  • $LANG 表示语言和字符集

  • $PWD 表示当前所在工作目录

       [root@localhost ~]# echo $PATH
       /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
       [root@localhost ~]# echo $USER
       root
       [root@localhost ~]# echo $HOME
       /root
       [root@localhost ~]# echo $LANG
       zh_CN.UTF-8
       [root@localhost ~]# echo $PWD
       /root
    

4、环境变量的特性:

可以使子进程(包括孙子进程)继承父进程的变量,但是无法让父进程使用子进程的变量。
一旦子进程修改从父进程继承的变量,将会新的值传递给孙子进程。
一般只在系统配置文件中使用,在脚本中较少使用。

3.2 环境变量的配置文件

自定义的环境变量只是临时生效,退出系统后就会失效。需要将自定义的环境变量放入配置文件中,才会永久生效。配置文件可以用来长期变更或设置环境变量。

全局配置文件:

  • /etc/profile,修改此文件会作用于所有用户。

用户独立的配置文件:

  • ~/.bash_profile,修改这个文件只作用于当前用户。

示例:
1)将脚本文件所在目录添加进可执行文件的默认路径PATH中,则可直接通过文件名称执行该程序。

 [root@localhost ~]# echo "echo 'hello stars'" > /data/hello.sh  //写一个脚本
 [root@localhost ~]# cat /data/hello.sh
 echo 'hello stars'
 [root@localhost ~]# chmod a+x /data/hello.sh     //为脚本增加执行权限
 [root@localhost ~]# vim /etc/profile            //编辑全局配置文件
 ---------------------------
 export PATH=$PATH:/data       //将/data加入变量PATH中
 ​
 [root@localhost ~]# source /etc/profile    //刷新文件,使立即生效
 [root@localhost data]# echo $PATH
 /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/data
 [root@localhost ~]# hello.sh    //现在可直接使用文件名执行该脚本
 hello stars

2)在当前用户环境中,添加系统的空闲等待时间TMOUT,等待15分钟后自动登出。

 [root@localhost ~]# echo $TMOUT              //查看TMOUT,没有该变量
 ​
 [root@localhost ~]# vim ~/.bash_profile     //编辑用户的配置文件,加入变量TMOUT
 ----------------------
 TMOUT=900       //超时900秒后自动注销   
 ​
 [root@localhost ~]# source ~/.bash_profile    //刷新文件,使立即生效
 [root@localhost ~]# echo $TMOUT               //查看变量TMOUT,显示为900
 900

4 只读变量

我们在定义shell变量时,默认定义的变量是可以被修改的,但有一种变量是不能修改的,就是只读变量。

只读变量只能被赋值一次。只读变量在取得初始值之后,只能进行读取操作,不能重新赋值或删除。

定义变量:

  • 第一步:name=value # 定义一个变量

  • 第二步:readonly name # 使用 readonly 来修饰该变量 ,表明只读

       [root@localhost data]# year=2022       //定义一个变量year         
       [root@localhost data]# readonly year   //使用 readonly 修饰该变量 ,表明只读
       [root@localhost data]# echo $year
       2022
       [root@localhost data]# year=2000      //无法重新赋值
       -bash: year: 只读变量
       [root@localhost data]# unset year     //无法使用unset删除
       -bash: unset: year: 无法反设定: 只读 variable
    

5 位置变量

位置变量也称为位置参数。

使用$n表示,n为数字序列号,且必须为整数。

如:$1、$2、…、 9 、 9 、 9{10}、${11}。

两位数需要加花括号{},不然$10会被识别为:$1和0 。

示例:

 [root@localhost ~]# cat weizhi.sh
 #!/bin/bash
 echo "$1"    #显示位置1的参数
 echo "$2"    #显示位置2的参数
 echo "$3"    #显示位置3的参数
 ​
 [root@localhost ~]# bash weizhi.sh aaa bbb ccc
 aaa      //对应$1
 bbb      //对应$2
 ccc      //对应$3
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Shell 脚本中的变量 的相关文章

  • 是否有可能在linux中找到包含特定文本的文件?

    考虑这种情况 我在文件夹 Example 下有很多文件 如果我需要找到一个包含特定短语 如 Class Example 的文件 我该如何使用 Linux shell 来做到这一点 linux中有类似 定位 的函数可以做到这一点吗 Thank
  • 在powershell中检查文件是否可读且正常

    我是 powershell 新手 我想检查文件是否可读且正常 在 unix 中 我们可以使用 f 和 r 在一行中完成此操作 例如 以下 shell 脚本函数接受文件名作为参数并检查文件的可读性和规律性 与此等效的 powershell 是
  • Linux shell 脚本:十六进制数字到二进制字符串

    我正在 shell 脚本中寻找一些简单的方法来将十六进制数字转换为 0 和 1 字符的序列 Example 5F gt 01011111 是否有任何命令或简单的方法来完成它 或者我应该为其编写一些开关 echo ibase 16 obase
  • 如何让“grep”从文件中读取模式?

    假设有一个很大的文本文件 我只想打印与某些模式不匹配的行 显然 我可以使用egrep v patter1 pattern2 pattern3 现在 如果所有这些模式都在一个文本文件中怎么办 最好的制作方法是什么egrep从文件中读取模式 g
  • 将“npm run start”的输出写入文件

    我想捕获的输出npm run start在一个文件中 我遇到了大量错误 我想更好地控制如何筛选输出 当我尝试时 npm run start gt log txt 我得到一个非常简短的文件 8 行 其结尾为 34m 39m 90m wdm 3
  • 在 Fish Shell 中设置导出

    我安装了多个版本的 PHP 对于我的正常开发 我总是使用通过自制程序安装的 PHP 5 5 x 在鱼壳里 which php php version gt usr local bin php gt PHP 5 5 8 cli built J
  • 如何使用 bash 显示具有两个子文件夹的文件夹?

    我通过 Cygwin 使用 bash 我有一个大文件夹 a 有很多子文件夹 b 这些子文件夹各有一个或两个子文件夹 c 我想找到所有有两个子文件夹 c 的子文件夹 b 并输出它们 结构如下 a b1 c1 b2 c1 c2 b3 c1 c2
  • bash 变量中的 Linux 鞭尾/对话框参数错误

    有人可以解释为什么下面的代码不起作用吗 我要疯狂地想找出答案 bin bash TEST M1 1 wire Interface ON echo TEST RESULT dialog title Config Modules State c
  • shell_exec 的输出被截断为 100 个字符

    当在 shell 中运行以下命令时 curl F file filename http 192 168 0 1 产生以下输出 Accuracy 0 0 1 classification Accuracy 0 0 1 classificati
  • 如何使用我在 github 中发布的 bash 脚本执行 chsh?

    我有一个要点 我总是用它来在新服务器上安装我需要的软件包 http gist github com 4372049 http gist github com 4372049 我需要做的就是通过 ssh 在新服务器中输入以下内容 bash c
  • awk: hping: 打印 icmp 发起/接收之间的差异

    我有以下输出hping http ports su net hping在 OpenBSD 上 hping icmp ts www openbsd org HPING www openbsd org re0 129 128 5 194 icm
  • Bash 解析和 shell 扩展

    我对 bash 解析输入和执行扩展的方式感到困惑 对于输入来说 hello world 作为 bash 中的参数传递给显示其输入内容的脚本 我不太确定 Bash 如何解析它 Example var hello world displaywh
  • 在 bash 中使用单个命令为 shell 变量分配默认值

    我对 bash 3 00 shell 脚本中的变量进行了大量测试 如果未设置变量 则它会分配默认值 例如 if z VARIABLE then FOO default else FOO VARIABLE fi 我似乎记得有一些语法可以在一行
  • C程序调用shell脚本

    我有一个小型 C 程序 调用 shell 脚本 myScript sh 我得到的 ret 值为 256 请帮助我了解系统调用出了什么问题 int main int ret ret system myScript sh ret gt gt r
  • 添加要在给定命令中运行的 .env 变量

    我有一个 env 文件 其中包含如下变量 HELLO world SOMETHING nothing 前几天我发现了这个很棒的脚本 它将这些变量放入当前会话中 所以当我运行这样的东西时 cat env grep v xargs node t
  • 如何使用shell脚本从json字符串中grep特定字段值[重复]

    这个问题在这里已经有答案了 下面是文件中可用的 JSON 字符串 我需要从中提取值status在 shell 脚本中 预期输出 status success 响应 json eventDate null dateProccessed nul
  • 如何通过保持目录结构完整来同步路径中匹配模式的文件?

    我想将所有文件从服务器 A 复制到服务器 B 这些文件在不同级别的文件系统层次结构中具有相同的父目录名称 例如 var lib data sub1 sub2 commonname filetobecopied foo var lib dat
  • 当 grep "\\" XXFile 我得到“尾随反斜杠”

    现在我想查找是否有包含 字符的行 我试过grep XXFile但它暗示 尾随反斜杠 但当我尝试时grep XXFile没关系 谁能解释一下为什么第一个案例无法运行 谢谢 区别在于 shell 处理反斜杠的方式 当你写的时候 在双引号中 sh
  • 在退出脚本之前等待后台进程完成

    在退出脚本 TCL Bash 之前 如何确保所有后台进程已完成执行 我正在考虑将所有后台进程 pid 写入 pid 文件 然后最后 pgrep pidfile 以查看在退出之前是否有任何进程仍在运行 有一些更简单的方法可以做到这一点吗 TC
  • 在 shell 脚本中将一个子字符串替换为另一个字符串

    我有 我爱苏子并结婚 我想将 苏子 更改为 萨拉 firstString I love Suzi and Marry secondString Sara 期望的结果 firstString I love Sara and Marry 要更换

随机推荐

  • LeetCode·每日一题·2437. 有效时间的数目·模拟

    作者 xff1a 小迅 链接 xff1a https leetcode cn problems number of valid clock times solutions 2262448 mo ni zhu shi chao ji xian
  • john破解用户密码和防破解

    目录 一 系统弱口令检测 二 防止暴力破解 一 系统弱口令检测 Joth the Ripper xff0c 简称JR 一款开源的密码分析工具 xff0c 支持字典式的暴力破解 通过对shadow文件的口令分析 xff0c 可以检测密码强度
  • 块设备驱动介绍-linux驱动开发第10部分-朱有鹏-专题视频课程

    块设备驱动介绍 linux驱动开发第10部分 3265人已学习 课程介绍 本课程是linux驱动开发的第10个课程 xff0c 主要内容是linux的块设备驱动的介绍 xff0c 首先详细讲了块设备驱动和字符设备驱动的核心差异 xff0c
  • Linux各个系统版本及区别(Ubuntu,CentOS..)

    一 概览 Linux的版本号分为两部分 xff1a 内核版本和发行版本 内核版本 xff1a 不包含外围程序GNU程序库和工具 xff0c 命令行shell xff0c 图形界面的X Window系统和相应的桌面环境等 发行版本 xff1a
  • keil5编译报错问题

    keil5一开始编译文件总是报错 error 3092 anonymous unions are only supported in gnu mode or when enabled with pragma anon unions 错误 x
  • MySQL中的函数

    1 单行函数和多行函数 xff08 聚合函数 分组函数 xff09 xff1a 只对一行进行变换 每行返回一个结果 xff1b 1 单行函数 xff1a a 数值函数 xff1a 基本函数 xff1a ABS x 绝对值 SIGN x 0
  • Centos防火墙配置

    一 防火墙的概念 防火墙技术是用于安全管理的软件和硬件设备 xff0c 在计算机内 外网之间构建一道相对隔绝的保护屏障 xff0c 以保护数据和信息安全性的一种技术 防火墙分为网络防火墙和主机防火墙 网络防火墙由软件和硬件组成 xff0c
  • linux 线程的调度策略

    目录 一 调度策略 1 实时线程 2 非实时线程 3 抢占式调度策略 运行特点 xff1a 4 轮询式调度策略 运行特点 xff1a 二 设置线程的调度策略步骤 1 定义线程句柄 2 定义线程属性结构体 3 初始化属性结构体 4 设置线程是
  • 16选1数据选择器和32选1数据选择器multisim

    大致思路 xff1a xff08 正经内容在下边 xff09 学校期中考试 xff0c 搜了半天发现连16 1都很难搜到 xff0c 一整天做出来 xff0c 趁着还有兴致记录一下过程 老师上课只教了4 1数据选择器 xff0c 于是先从8
  • 【软件工程】对软件工程课程的希望及个人目标

    自我简介 首先进行一下自我介绍 xff0c 我是一名桂林理工大学信息科学与工程学院的本科在读生 xff0c 现已经是本科二年级的学生了 xff0c 上个学期我们刚经历了专业分流 xff0c 很幸运 xff0c 我来到了我所希望来到的软件工程
  • 网络设备驱动介绍-linux驱动开发第11部分-朱有鹏-专题视频课程

    网络设备驱动介绍 linux驱动开发第11部分 3869人已学习 课程介绍 本课程是linux驱动开发的第11个课程 xff0c 主要内容是linux的网络驱动的介绍 xff0c 首先讲述了网络设备驱动接口和之前讲的2种的不同 xff0c
  • 六、如何使用VS调试代码、条件语句

    how to use Visual Studio to debug our code 查看程序断点 调试程序 1 设置断点 断点 xff0c 调试器将中断 xff0c break xff0c 程序调试是将会中断 xff0c continue
  • 【FPGA】Verilog:组合电路 | 3—8译码器 | 编码器 | 74LS148

    前言 xff1a 本章内容主要是演示Vivado下利用Verilog语言进行电路设计 仿真 综合和下载 示例 xff1a 编码 译码器的应用 功能特性 xff1a 采用 Xilinx Artix 7 XC7A35T芯片 配置方式 xff1a
  • ipv6简介

    IPv6地址扩展到128位 2128足够大 xff0c 这个地址空间可能永远用不完 事实上 xff0c 这个数足够为地球上每个分子分配一个IP地址 IPv6地址采用冒号分隔的十六进制数表示 xff0c 例如下面是一个IPv6地址8000 0
  • Nginx -- SSL模块

    目录 一 什么是ssl证书 二 证书的作用 1 浏览器绿色安全标志 2 网站数据加密传输 3 安全标志获得访客信任 4 强大的加密等级保障 5 SSL证书帮助网站保护了用户和网站之间的任何数据的安全 三 SSL证书的类别 1 按照验证方式
  • shell的echo命令

    echo命令用于在shell中打印shell变量的值 xff0c 或者直接输出指定的字符串 linux的echo命令 xff0c 在shell编程中极为常用 在终端下打印变量value的时候也是常常用到的 xff0c 因此有必要了解下ech
  • 2022最新hexo最新搭建教程

    本文时间 xff1a 2022 02 03 安装包版本如下 xff1a NodejsLTS16 13 2 Git2 35 0 成果预览 故人随笔 nodejs安装 1 双击安装包 2 Next 3 修改安装目录为 D Develop nod
  • 子网划分与子网汇总

    1 192 168 1 0 255 255 255 128 划分为4个子网 192 168 1 0 27 192 168 1 1 192 168 1 31 192 168 1 96 27 192 168 1 32 192 168 1 63
  • mongodb 启动rails server

    oot 64 5d5b156fb1b0 cat etc release DISTRIB ID 61 Ubuntu DISTRIB RELEASE 61 20 04 DISTRIB CODENAME 61 focal DISTRIB DESC
  • Shell 脚本中的变量

    文章目录 1 变量概述1 1 变量类型1 2 变量的命名要求1 3 变量作用范围 2 局部变量3 环境变量3 1 系统内置环境变量3 2 环境变量的配置文件 4 只读变量5 位置变量 1 变量概述 变量即在程序运行过程中它的值是允许改变的量