前言
变量是任何一种编程语言都必不可少的组成部分,变量用来存放各种数据。脚本语言在定义变量时通常不需要指明类型,直接赋值就可以,Shell 变量也遵循这个规则。在 Bash shell 中,每一个变量的值都是字符串,无论你给变量赋值时有没有使用引号,值都会以字符串的形式存储。这意味着,Bash shell 在默认情况下不会区分变量类型,即使你将整数和小数赋值给变量,它们也会被视为字符串,这一点和大部分的编程语言不同。当然,如果有必要,你也可以使用 declare 关键字显式定义变量的类型,但在一般情况下没有这个需求,Shell 开发者在编写代码时自行注意值的类型即可。
变量的分类
内置变量
具体详情请参考:https://www.cnblogs.com/guge-94/p/10688982.html
环境变量
常用的环境变量
PATH 指定命令的搜索路径。通过设置环境变量PATH可以让我们运行程序或指令更加方便。
HOME 指定用户的主工作目录,即为用户登录到Linux系统中时的默认目录,即“~”。
HISTSIZE 指保存历史命令记录的条数。
LOGNAME 指当前用户的登录名
HOSTNAME 指主机的名称。
SHELL 指当前用户用的是哪种shell
LANG/LANGUGE 和语言相关的环境变量,使用多种语言的用户可以修改此环境变量。
MAIL 指当前用户的邮件存放目录
PS1 第一级Shell命令提示符,root用户是#,普通用户是$
PS2 第二级命令提示符,默认是“>”
PS3 第三级命令提示符。
TMOUT 用户和系统交互过程的超时值。
RANDOM 随机数变量。每次引用这个变量会得到一个0~32767的随机数。
PWD 当前工作目录
PPID 当前进程的父进程的PID
SECONDS 脚本已经运行的时间(以秒为单位)
自定义变量
用户自己定义的变量,自定义变量又叫局部变量,仅能在用户当前的子进程中使用;
变量的定义
Shell 支持以下几种定义变量的方式:
variable=value
variable='value'
variable="value"
variable=`command`
variable=$(command)
variable 是变量名,value 是赋给变量的值。如果 value 不包含任何空白符(例如空格、Tab 缩进等),那么可以不使用引号;如果 value 包含了空白符,那么就必须使用引号包围起来。使用单引号和使用双引号也是有区别的,稍后我们会详细说明。注意,赋值号=的周围不能有空格,这可能和你熟悉的大部分编程语言都不一样。单引号与双引号的区别请参考:https://www.cnblogs.com/guge-94/p/10678192.html
注意:shell中的变量也有作用域的概念。
变量的相关操作
只读变量
variable="value" readonly variable
删除变量
variable="value" unset variable
使用变量
variable="value" echo ${variable} echo $variable
定义全局
export variable="value" export variable # 变量如果事先已经定义好了,则只需要将相应的变量名放入到export后面,即可将相应的自定义变量变成环境变量
显示所有环境变量
env
相关命令
export
用于设置或显示环境变量
格式
export [-fnp][变量名称]=[变量设置值]
选项
-f 代表[变量名称]中为函数名称。 -n 删除指定的变量。变量实际上并未删除,只是不会输出到后续指令的执行环境中。 -p 列出所有的shell赋予程序的环境变量。
env
显示当前用户的变量
set
设置所使用shell的执行方式,可依照不同的需求来做设置
格式
set [+-abCdefhHklmnpPtuvx]
选项
-a 标示已修改的变量,以供输出至环境变量。 -b 使被中止的后台程序立刻回报执行状态。 -C 转向所产生的文件无法覆盖已存在的文件。 -d Shell预设会用杂凑表记忆使用过的指令,以加速指令的执行。使用-d参数可取消。 -e 若指令传回值不等于0,则立即退出shell。 -f 取消使用通配符。 -h 自动记录函数的所在位置。 -H Shell 可利用"!"加<指令编号>的方式来执行history中记录的指令。 -k 指令所给的参数都会被视为此指令的环境变量。 -l 记录for循环的变量名称。 -m 使用监视模式。 -n 只读取指令,而不实际执行。 -p 启动优先顺序模式。 -P 启动-P参数后,执行指令时,会以实际的文件或目录来取代符号连接。 -t 执行完随后的指令,即退出shell。 -u 当执行时使用到未定义过的变量,则显示错误信息。 -v 显示shell所读取的输入值。 -x 执行指令后,会先显示该指令及所下的参数。 -o 包含管道命令的语句的返回值,会变成最后一个返回非零的管道命令的返回值 +<参数> 取消某个set曾启动的参数。
比较常用的选项是-e与-o,有的人喜欢使用这个参数,是出于保证代码安全性的考虑。但有的时候,这种美好的初衷,也会导致严重的问题;设置了set -o,返回从右往左第一个非零返回值。
unset
shell内建指令,可删除变量或函数
格式
unset [-fv][变量或函数名称]
选项
-f 仅删除函数
-v 仅删除变量
readonly
用于声明变量或函数的属性为只读,声明后这些变量或函数不可修改。
格式
readonly [选项] [参数]
选项
-f:定义只读函数; -a:定义只读数组变量; -p:显示系统中全部只读变量列表
declare
声明 shell 变量
格式
declare [+/-][rxi][变量名称=设置值] 或 declare -f
选项
+/- "-"可用来指定变量的属性,"+"则是取消变量所设的属性。 -f 仅显示函数。 r 将变量设置为只读。 x 指定的变量会成为环境变量,可供shell以外的程序来使用。 i [设置值]可以是数值,字符串或运算式。
变量的扩展操作
请参考:https://www.cnblogs.com/guge-94/p/10482934.html