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时,可通过注销再登录来恢复变量的类型
                    
                
                
            
        
浙公网安备 33010602011771号