Shell_03_环境变量

@

环境变量

环境变量:以一组字符串替换设置或保留数据(存储在内存中)

1)环境变量分为:全局变量、局部变量


全局变量和局部变量对于父/子Shell的区别:

1)全局变量对于所有Shell和其子Shell均可调用;

2)局部变量仅能由创建该变量的Shell调用;


变量调用形式:${变量名}

1)也可通过“$变量名”的形式调用

2)若调用数组变量中指定值的形式:${变量名[索引值]}


调用变量时,可使用的符号:

符号 说明
“ ” (双引号) 使系统能够识别变量 实现转义(如:“/*”)
‘ ’ (单引号) 使系统不能识别变量 不能转义(只会原样输出单引号的内容)
` ` (反引号) 将脚本内执行命令后得到的数据赋给变量 将括定的内容形成一个完整的表达式
\ (反斜杠) 将特殊符号转换为一般字符 放在特殊字符前即可表示转义

set命令:列出目前shell环境下的所有环境变量

指令格式:set

1)同时列出全局变量、局部变量和用户自定义变量;

2)列出的顺序是按照字母顺序进行排序;


如:查询set文件中命令提示符的变量
在这里插入图片描述

符号 含义
\d 显示“星期 月 日”信息
\H 显示完整主机名
\h 仅显示主机名第一个小数点前的名字
\t 显示时间 24小时“HH:MM:SS”的格式
\u 显示目前用户的名称
\v 显示BASH版本信息
\w 显示完整的当前工作目录名称
\W 仅显示当前工作目录的最后一个目录名称
\# 显示当前终端执行的第几个命令
\$ 显示用户标识符

系统变量

Bash Shell在系统启动时,会默认创建特殊的环境变量作为系统变量

1)系统环境变量的名称默认使用全大写(区分用户变量)


env命令(environment):列出当前系统全局变量

指令格式:env


如:列出当前系统全局变量
在这里插入图片描述

1)与export命令相似,但export比env多出一些内容


常见的Bash Shell环境变量如下:

变量名 说明
* 所有命令行参数(单值形式)
@ 所有命令行参数(多值形式)
# 命令行参数的个数
? 最后一次前台进程的退出状态码
- 当前命令行选项标记
$ 当前Shell的进程PID
! 最近执行的后台进程的PID
0 命令行中使用的命令名称
_ Shell的绝对路径名
BASH 调用Shell的绝对路径
BASHOPTS 允许冒号分隔列表形式的Shell选项
BASHPID 当前Bash Shell的进程ID
BASH_ALIASED 当前所用别名的数组
BASH_ARGC 子函数中的参数的个数
BASH_ARGV 指定命令行参数的数组
BASH_CMDS 命令的内部散列表的数组
BASH_COMMAND 当前正在被执行的命令名
BASH_ENV Shell脚本运行前,默认执行的文件
BASH_LINENO Shell脚本中每个命令的行号的数组
BASH_REMATCH 与指定正则表达式匹配的文本元素的数组
BASH_SOURCE Shell中已声明函数所在源文件名的数组
BASH_SUBSHELL 当前Shell所生成的子Shell数目
BASH_VERSINFO 当前Shell的主版本号和次版本号的数组
BASH_VERSION 当前Shell的版本号
COLUMNS 当前Shell终端的宽度
COMP_CWORD 当前光标所在位置
COMP_KEY 调用补全功能的按键
COMP_LINE 当前命令行
COMP_POINT 当前光标位置相对于当前命令起始位置的索引
COMP_TYPE 补全烈性所对应的整数值
COMP_WORDBREAKS 进行单词补全时,用作单词分隔符的字符
COMP_WORDS 当前命令行上所有单词的数组
COMPREPLY 由Shell函数生成的可能补全码的数组
COPROC 用于匿名携程I/O的文件描述符的数组
DIRSTACK 目录栈当前内容的数组
ENV Shell以POSIX模式调用时,默认执行的文件
EUID 当前用户的有效UID
FCEDIT fc命令使用的默认编辑器
FIGNORE 以冒号分隔的后缀名列表,在补全时被忽略
FUNCNAME 当前执行的Shell函数名称
FUNCNEST 嵌套函数的最高层级
GLOBIGNORE 以冒号分隔的模式列表中的文件名展开时被忽略
GROUPS 当前用户属组的数组
histchars 控制历史记录展开的字符
HISTCMD 当前命令在历史记录中的编号
HISTCONTROL 控制那些命令留在历史记录列表中
HISTFILE 保存Shell历史记录列表的文件名 (默认为~/.bash_history)
HISTFILESIZE 保存在历史文件中的最大行数
HISTIGNORE 以冒号分隔的模式列表中的命令不存进历史记录
HISTSIZE 最多可记录的命令条数
HISTIMEFORMAT 决定历史文件条目的时间戳的格式字符串
HOSTFILE Shell在补全主机名时,读取的文件名
HOSTNAME 主机名称
HOSTTYPE 运行Shell的终端
IGNOREEOF Shell在退出时,必须收到连续的EOF字符的数量 默认值为1
INPUTRC readline初始化
LANG Shell的语系
LC_ALL Shell整体语系环境(覆盖LANG)
LC_COLLATE 字符串值排序时,所使用的语系
LC_CTYPE 文件名扩展和模式匹配时,所使用的语系
LC_MESSAGES 解析前置$的双引号字符串,所使用的语系
LC_NUMERIC 格式化数字时,所使用的语系
LINENO Shell脚本中当前执行代码的行号
LINES 定义了终端上可见的行数
MACHTYPE “CPU-公司-系统”格式定义系统类型
MAILCHECK Shell查看新邮件的周期(默认为60s)
OLDPWD Shell之前的工作目录
OSTYPE 运行Shell的操作系统
PIPESTATUS 前台进程退出状态码的数组
POSIXLY_CORRECT Bash是否以POSIX模式启动
PPID Bash Shell父进程的PID
PROMPT_COMMAND 命令行主提示符之前执行的命令
PS1 主提示符的字符串
PS2 次提示符的字符串
PS3 select命令的提示符
PWD 工作目录
RANDOM 返回0~32767的随机数
READLINE_LINE 保存readline行缓冲区的内容
READLINE_POINT 当前readline行缓冲区的插入点位置
REPLY read命令的默认变量
SECONDS Shell已运行的时间(秒)
SHELL Shell的绝对路径
SHELLOPTS 一起用Bash Shell选项列表(冒号分隔)
SHLVL 当前Shell层级
TIMEFORMAT Shell显示时间值的格式
TMOUT select和read命令在无输入的情况下,等待时间
TMPDIR Shell的临时文件目录
UID 运行Shell的用户UID

如:使用$?变量判断命令执行情况
在这里插入图片描述


Shell脚本默认变量:实现类似Linux内建命令中的选项功能

本质:通过变量让系统把选项传递给命令


接受变量:

${0} //命令本身

${1} //第一个选项

${2} //第二个选项

${N} //第N个选项

(1)也可用“$N”形式表示

1)但当N大于9时,必须使用“${N}”形式


(2)其中3个特殊系统变量

1)$#:参数个数(有几个选项,等于N)

2)$@:代表“$1” “$2” “$3” “$N”

3)$*:代表“$1分隔符$2分隔符$3分隔符$N”


如:test13.sh脚本能够接受外部三个选项并输出

1)编写test13.sh脚本文件
在这里插入图片描述
2)调用test13.sh脚本文件
在这里插入图片描述

//若传入的参数中含有空格,应使用双引号括起来


shift命令:参数变量偏移

指令格式:shift N

1)N为数字,指定偏移位数(若没有指定N,则默认偏移一位)

2)本质:$1和后续变量的移动,$0是固定不变的


如:使用shift_paras.sh脚本文件打印1、2、3、4、5、6

1)编写shift_paras.sh脚本文件
在这里插入图片描述
2)调用shift_paras.sh脚本文件
在这里插入图片描述


如:实现脚本文件可同时接受选项和参数

1)编写test17.sh脚本文件
在这里插入图片描述
在这里插入图片描述
//Linux中默认将双坡折线作为选项和参数的分隔
2)调用test17.sh脚本文件
在这里插入图片描述

自定义变量

变量名规则:

1)只能使用英文字母、数字和下划线(首个字符不能为数字);

2)不能包含空格和标点符号,不能使用特殊关键字;

3)变量名区分大小写,且长度不能超过20个字符;

//建议自定义变量名为小写(区分系统环境变量)


变量的赋值形式:变量名=变量值

1)等号的左右两边不能有空格和其他符号;

2)未被定义的变量被调用时,默认其内容为空;

3)变量值中若含有特殊内容可使用单/双引号等进行保留或转换;

4)若定义数组变量,可将数组值使用圆括号括起来,并使用空格分隔


将命令赋值给变量形式:变量名=`命令`

1)也可用“变量名=$(命令)”形式;


变量值追加形式:变量名=${${变量名}新增内容}

1)两个变量名也可不同,可实现将某一变量添加内容后赋值给指定变量;


如:设置test2.sh脚本能够打印当前时间
在这里插入图片描述
在这里插入图片描述

1)父Shell的自定义变量是无法在子Shell内使用的

//父Shell的全局变量是子Shell可以使用的

2)子Shell退出后,子Shell的所有变量都会注销(不会传回到父Shell)


export命令:使局部变量变成全局变量

指令格式:export 变量名

1)若没有变量名,则默认显示所有环境变量

2)自定义变量默认为局部变量


如:设置name变量并赋值在子程序调用
在这里插入图片描述

特殊自定义变量

read命令:定义输入变量

指令格式:read 选项 变量名

选项 含义
-p 设置输入提示信息 在输入变量前,显示提示信息
-t 设置等待输入时间 若时间结束,直接结束输入
-n 设置接受的字符数量 若接受字符数量达到指定值,则默认开始执行
-s 隐藏输入

1)提示信息中若有空格,需要用单引号括起来;

2)输入变量:等待用户输入后,继续执行脚本;

3)若read命令不指定变量,则默认将输入数据存储至REPLY变量中;


如:test4.sh脚本能够根据用户输入的路径,在该路径下创建一文件(并列出)
在这里插入图片描述
在这里插入图片描述


readonly命令:定义只读变量或函数

指令格式:readonly 选项 变量名

选项 含义
-f 定义只读函数
-a 定义制度数组变量
-p 显示系统中全部只读变量

1)不跟选项,默认定义只读变量

2)只读变量(readonly):变量仅能读,不能赋值


如:test3.sh脚本内的a变量先赋值为1,设置为只读变量再赋值为2
在这里插入图片描述
在这里插入图片描述


unset命令:删除指定变量

指令格式:unset 变量名

1)删除数组变量中的一个值时,该值在数组中索引位会被置空(仍占位);

//变量进行索引时,仍需计算该索引位


declare命令:声明变量类型

指令格式:declare 选项 变量名

选项 含义
-a (array) 定义为数组变量
-i (integer) 定义为整数变量
-x 定义为环境变量
-r 定义为readonly类型 且不能被unset
-p 列出变量的类型

1)declare和typeset是完全一样的使用和功能;

2)变量类型默认为字符串;

3)“-”变成“+”,则是取消对应的变量类型(-p除外);

4)变量被设置为readonly时,可通过注销再登录来恢复变量的类型

posted @ 2022-02-07 14:26  爱和可乐的w  阅读(131)  评论(0编辑  收藏  举报