Shell全局变量、局部变量与特殊变量的具体使用

 更新时间:2023年05月06日 11:12:11   作者:Apollon_krj  
本文主要介绍了Shell全局变量、局部变量与特殊变量的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

变量类型:全局变量(环境变量)和局部变量(本地变量)
环境变量可以在定义它们的shell及其派生出来的任意子进程的shell中使用。局部变量只能在定义它们的函数/脚本中使用。还有一些变量是用户创建的,其他的则是专用的shell变量。

1、全局变量(环境变量):

环境变量可用于定义shell的运行环境,环境变量可以在配置文件中定义与修改,也可以在命令行中设置,但是命令行中的修改操作在终端重启时就会丢失,因此最好在配置文件中修改(用户家目录的“.bash_profile“文件或者全局配置“/etc/profile”、“/etc/bashrc”文件或者“/etc/profile.d”文件中定义。)将环境变量放在profile文件中,每次用户登录时这些变量值将被初始化。比如HOME、USER、SHELL、UID等再用户登录之前就已经被/bin/login程序设置好了。

常见系统环境变量:

TMOUT:设置自动退出的误操作等待时间
HOSTTYPE:系统文件系统类型
HISTSIZE:历史命令记录条数
HOME:用户登录时进入的目录,家目录
UID:当前用户的id
SHELL:当前shell解释器
PWD:当前所在路径(每改变一次目录,该值就会改变)
PATH:可执行文件默认路径
等等。

可以用echo来显示查看全局变量(eg:echo $HOME)。env(或printenv)、set也可以用来查看系统的环境变量,但不是单独查看。而用unset临时取消环境变量(eg:unset USER),要永久生效还是要写到配置文件中

自定义环境变量(采用export):
①export 变量名=value
②变量名=value;export 变量名
③declare -x 变量名=value
这里依旧是临时生效,在shell终端关闭后就消失了,写到配置文件中则永久生效(注意:写到配置文件中后需要运行一遍配置文件的脚本才可生效,否则等重启时生效)

命令行的三种方式测试如下:

关于环境变量PATH与export的更详细的内容,可参考: Linux环境变量与系统编程学习笔记

2、局部变量(本地变量):

本地变量在用户当前的shell生存期的脚本中使用。在一个函数中将某个变量声明为local,则该变量就是一个局部变量,只在本函数中有效。
定义:

变量名=value
变量名=’value’
变量名=”value”
shell中变量名的要求:一般遵循字母、数字、下滑线组成,不能以数字开头

eg:以下脚本执行后(交互式非交互式都可以测试)输出什么( c与 {c}等同)?

a=192.168.1.1
b='192.168.1.2'
c="192.168.1.3"
echo "A=$a"
echo "B=$b"
echo "C=${c}"
a=192.168.1.1-$b
b='192.168.1.2-$b'
c="192.168.1.3-$b"
echo "A=$a"
echo "B=$b"
echo "C=${c}"

输出结果如下:

A=192.168.1.1
B=192.168.1.2
C=192.168.1.3
A=192.168.1.1-192.168.1.2
B=192.168.1.2-$b
C=192.168.1.3-192.168.1.2-$b

总结分析:
单引号与双引号的区别在于:单引号内若存在变量,存在的变量当做字符串不会被解析,原样输出;而双引号中若存在变量,该变量会被解析出其具体的值再加入到字符串中。①不加引号可以直接定义内容包含数字、字符串、路径名等,适合定义数字②单引号适合于纯定义字符串,③而双引号适合于字符串的内容中包含有变量的内容的定义。(习惯:数字以及不带空格的简单字符串不加引号,其它长的特别是有空格的字符串加双引号;遇到“$变量名”,但不想解析的加单引号,但一般出现$都是为了解析变量,所以单引号较少使用)

注意:单引号与双引号的特点不具有普遍性,如下:
在普通shell中:

ETT=123
echo '$ETT'	//打印$ETT(单引号不解析)
echo "$ETT"    //打印123(双引号解析)

而在awk中调用shell变量:

awk 'BEGIN {print '$ETT'}'//打印123(单引号解析)
awk 'BEGIN {print "$ETT"}'//打印$ETT(双引号不解析)

虽然在awk中不具有普遍性,但是在普通Shell中还是具有普遍性的。

3、关于局部变量的其它一些问题

①用反引号将命令的结果作为变量名是常用的方法,eg:cmd=`date +%F`
②用$符号将命令的结果作为变量名也比较常用,eg:cmd=$(date +%F)
③变量在大括号上的使用:在以时间、主机名等为包名一部分来打包的时候常用

eg1:用时间作为文件名的一部分打包

cmd=$(date +%F)    //由于`date +%F`的反引号不容易辨认,就不太使用`date +%F`
tar -zcf code_$(date+ %F)_kang.tar.gz /etc //没有问题
tar -zcf code_`date +%F`_kang.tar.gz /etc   //没有问题
tar -zcf code_kang_$cmd.tar.gz /etc    //没有问题
tar -zcf code_$cmd_kang.tar.gz /etc	//会有歧义,因为系统会不清楚是应该解析$cmd还是cmd_kang
tar -zcf code_${cmd}_kang.tar.gz /etc  //不会有歧义

对后两种测试结果如下(不加{}的与理想结果是不符的):

eg2:用主机名与时间打包

cmd=$(date +%F)
host=$(hostname)
tar -zcf code_${cmd}_${host}.tar.gz /etc   

测试:

养成将字符串括起来使用的习惯防止不易发现的错误。

4、Shell的特殊变量:

$0:获取当前执行的shell脚本的文件名(执行时给定的是完整路径则获取到的也是完整路径)

两个命令与$0的组合测试:获取一个带路径的文件的路径名与文件名两部分

dirname(获取目录名部分)
basename(获取文件名部分)

测试:

$n:获取当前执行的shell脚本的第n个参数,如果n=0则获取的是脚本的文件名。如果n>9则需要用大括号括起来,eg:${21}

测试$n:

$*:获取当前执行的shell的所有参数,将所有的命令行参数视为单个字符串
$#:获取当前shell命令行中参数的总个数
$@:这个程序的所有参数"$1" "$2" "$3" "...",这是将参数传递给其它程序的最佳方式,因为它会保留所有内嵌在每个参数里的任何空白

$*与$@的区别:
$*将命令行的所有参数视为一个字符串:"$1$2$3..."
$@将命令行的每个参数视为单个的字符串:"$1" "$2" "$3" ...

基本测试如下:

获取状态变量:
$$:获取当前的shell进程号
$?:获取执行上一个指令的返回值(0为成功,非零为失败),可以对上一个命令执行是否成功进行判断。
$_:在此之前执行的命令或脚本的最后一个参数

$?变量其实获取的是上一个程序返回给父进程shell的返回值(该值在0-255之间:0表示运行成功,2表示权限拒绝,1~125为运行失败原因是脚本命令、系统命令错误或参数传递错误,126为找到该命令但是无法执行,127为无该命令/程序,>128表示命令被系统强制结束)

$?的不同返回值测试:

$?的值范围测试如下:

$?在脚本中的应用:

常用来判断上一步是否成功(压缩失败打印ERROR压缩成功打印OK):

到此这篇关于Shell全局变量、局部变量与特殊变量的具体使用的文章就介绍到这了,更多相关Shell全局变量、局部变量与特殊变量内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • linux下采用shell脚本实现批量为指定文件夹下图片添加水印的方法

    linux下采用shell脚本实现批量为指定文件夹下图片添加水印的方法

    这篇文章主要介绍了linux下采用shell脚本实现批量为指定文件夹下图片添加水印的方法,需要的朋友可以参考下
    2014-07-07
  • Linux 查看内存插槽数、最大容量的方法

    Linux 查看内存插槽数、最大容量的方法

    下面小编就为大家带来一篇Linux 查看内存插槽数、最大容量的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • Linux 深入理解进程权限

    Linux 深入理解进程权限

    这篇文章主要介绍了Linux 深入理解进程权限的相关资料,关于文件权限,大部分人接触比较多,也比较熟悉了解.但是对进程权限一般知之甚少。这里就总结一下linux系统下进程权限问题和现象,需要的朋友可以参考下
    2016-11-11
  • 在Bash脚本中引入alias的方法

    在Bash脚本中引入alias的方法

    这篇文章主要介绍了在Bash脚本中引入alias的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • Window11 WSL2 添加静态IP的脚本

    Window11 WSL2 添加静态IP的脚本

    这篇文章主要介绍了Window11 WSL2 添加静态IP的脚本方法,通过一段脚本给 Windows 端的"vEthernet (WSL)"加了IPv4 172.18.16.1,给 Linux 端的 eth0 添加 IPv4 172.18.16.1,在使用前,请按需调整网络接口的名称和IP地址,需要的朋友可以参考下
    2023-01-01
  • linux shell内置判断语句

    linux shell内置判断语句

    内置判断,成功的时候返回0,不成功返回非零。接下来通过本文重点给大家介绍linux shell内置判断语句,感兴趣的的朋友一起看看吧
    2017-08-08
  • 在 Shell 提示符中显示 Git 分支名称的方法

    在 Shell 提示符中显示 Git 分支名称的方法

    这篇文章主要介绍了在 Shell 提示符中显示 Git 分支名称的方法,本文详细的讲解了解决这个需求的过程,需要的朋友可以参考下
    2015-04-04
  • Shell 命令执行顺序分析[图]

    Shell 命令执行顺序分析[图]

    Shell 从标准输入或脚本中读取的每一行称为管道(pipeline);它包含了一个或多个命令(command),这些命令被一个或多个管道字符(|)隔开
    2013-01-01
  • shell脚本一键安装php7的实例(推荐)

    shell脚本一键安装php7的实例(推荐)

    下面小编就为大家带来一篇shell脚本一键安装php7的实例(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • 浅析Linux打包压缩解压缩命令大全(收藏)

    浅析Linux打包压缩解压缩命令大全(收藏)

    本文给大家分享Linux打包压缩解压缩命令大全,非常不错,具有参考借鉴价值,需要的朋友参考下吧
    2017-09-09

最新评论