SHELL脚本攻略(学习笔记)--1.4 变量(基础)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SHELL脚本攻略(学习笔记)--1.4 变量(基础)相关的知识,希望对你有一定的参考价值。

假设变量str,设置或修改变量属性时,不带$号,只有引用变量时才使用$号。也就是说变量是str,而不是$str。$只是操作变量时的一种符号形式,还有比如${}、${#} 、$(())等符号形式,它们分别代表不同的意思。这一点很容易搞错。

1.4.1 环境变量

环境变量就是运行在“环境”上下文的,在这个上下文都可以引用。例如常见的cd、ls等命令严格来说应该使用绝对路径如/bin/ls来执行,正是因为有了/bin目录加入了PATH环境变量,系统自己会去寻找PATH下的路径是否有该命令。

环境变量常用大写字母表示。常见的环境变量有HOSTNAME、SHELL、HISTSIZE、USER、PATH、PWD、LANG、HOME、LOGNAME。分别表示当前主机名、SHELL的路径即bash的类型、history保存多少记录、当前用户名、自动搜索路径、当前目录、使用的语系(临时修改语系时就改这个变量)、当前用户的家目录、当前登录的用户。

使用env可以查看当前用户的环境变量。

[[email protected] ~]# echo $PATH  #查看PATH环境变量

/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

1.4.2 普通变量

脚本语言中,变量通常不需要特地声明,直接赋值使用即可。bash中,变量默认都是字符串类型,不论是否使用引号赋值,都以字符串方式存储。

变量赋值方式:str=value,等号左右没有空格。如果有空格就是进行比较运算符的比较运算了。

变量引用方式:$str或者${str},某些地方必须使用${str}的引用方式才行,例如在双引号里echo "the var is ${str}"。

[[email protected] tmp]# str=Hello World!

[[email protected] tmp]# echo "We will say ${str}"

We will say Hello World!  #注意到没,感叹号竟然输出来了。所以特殊符号在变量里不像echo一样有时会错误识别。

释放变量:unset str #没加前缀$。

[[email protected] ~]# unset str

查看所有的临时变量:不接参数的set或者declare命令。

定义只读变量:readonly str。这时将无法修改变量值也无法unset变量,只能重新登录才删除变量。

临时将普通变量升级为环境变量:export str或者赋值时export str="value",这样$str就可以在当前shell和子shell中使用,但是退出脚本或者重新登录都会取消export效果。

[[email protected] ~]# unset str;str=Hello World!;echo $str

Hello World!

[[email protected] ~]# bash  #开启子shell

[[email protected] ~]# echo ${str} #子shell中查看变量结果发现没有该变量。

                                               

在子shell中查看变量,结果竟然发现没有该变量。这是因为$str的作用域只在当前shell,要想在子shell中也能引用普通变量,则需要使用export升级为环境变量。

[[email protected] ~]# exit   #退出子shell

exit

[[email protected] ~]# export str #回到父shell升级该变量

[[email protected] ~]# bash

[[email protected] ~]# echo $str

Hello World!

1.4.3 修改变量的生命周期和作用域

普通的变量在脚本结束或退出登录后就失效,并且只对当前shell有效,其他用户和当前用户的子shell都无法使用。

使用export可以升级为临时局部的环境变量,对当前用户的当前shell和子shell有效,但其他用户无效,退出脚本和退出登录后也失效。

将变量写入/etc/profile文件可以让变量变成永久且全局。不仅变量,其他设置写入该文件也一样。该文件是每个用户登录前都会调用的文件,所以对所有用户永久有效。修改该文件后需要重启或者使用source /etc/profile来重新调用使之生效。

将变量写入对应用户的家目录下的.bash_profile即~/.bash_profile文件可以容变量变成永久但只对对应用户有效。不仅变量,其他设置也一样。该文件是每个用户登录后都会读取的自己家目录下的文件,所以只对对应用户有效,当然对对应子shell也有效。同样需要重启或者使用source ~/.bash_profile来重新调用使之生效。

关于bash的读取和调用流程,这里简单说明下:

登录linuxè读取/etc/profile-->读取对应用户的.bash_profile或.bash_login或.profile(优先度从前向后递减,之所以有这三种文件是不同Linux的转变保留)-->对应用户的.bashrc(因为由.bash_profile调用所以后执行,这个子shell会读取)-->/etc/bashrc-->.bash_logout(用于退出时执行的一些动作,执行完成后才完全退出)。

如果/etc/profile.d/目录下有.sh文件,则会在读取/etc/profile时调用它们,也会在读取/etc/bashrc的时候调用它们。

技术分享

1.4.4 获取变量的长度

在使用${}方式引用变量时,变量名前加上#就可以查看该变量的字符长度。空格也算入长度。例如:

[[email protected] ~]# echo ${#str}

12

[[email protected] ~]# echo ${#PATH}

92

1.4.5 declare声明变量

declare [+/-][选项] 变量名

选项:

-/+:给变量设定类型属性,取消给变量设定的类型属性

-i:声明为整型

-x:声明为环境变量

-p:显式指定变量被声明的类型

例如,声明一个环境变量declare -x str,取消该变量declare +x str。

以上是关于SHELL脚本攻略(学习笔记)--1.4 变量(基础)的主要内容,如果未能解决你的问题,请参考以下文章

SHELL脚本攻略(学习笔记)--1.7 expr命令全解

SHELL脚本攻略(学习笔记)--1.8 别名

SHELL脚本攻略(学习笔记)--1.5 进行数学运算

SHELL脚本攻略(学习笔记)--1.7 数组

SHELL脚本攻略(学习笔记)--1.2 echo和printf打印输出

SHELL脚本攻略(学习笔记)--1.3 多命令逻辑执行顺序