Shell之变量

前言

  变量是任何一种编程语言都必不可少的组成部分,变量用来存放各种数据。脚本语言在定义变量时通常不需要指明类型,直接赋值就可以,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

原文地址:https://www.cnblogs.com/guge-94/p/11022651.html