环境变量
环境变量:以一组字符串替换设置或保留数据(存储在内存中)
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时,可通过注销再登录来恢复变量的类型