一 环境变量
(1)系统变量
顾名思义: '全局'的'环境'变量,操作系统'内置'的
① TMOUT
1)应用场景一
2)应用场景二
原因: 为了'增强'Linux系统的'安全性',需要在'用户输入'空闲一段时间后'自动断开',这个操作可以由设置TMOUT值来实现
说明: 退出前'等待超时'的秒数;防止'什么'也不做,占用'链接资源'
应用: 控制'ssh连接'在空闲时间超时,'自动断开'连接的时间,数字单位为"秒"
备注: 设置好ssh的'登录超时'时间以后,记得'退出重新登录'或重启系统,以使'配置生效'
+++++++++++++++'设置方式'+++++++++++++++
export TMOUT=900 设置'900秒内'用户无操作就'断开连接'
readonly TMOUT 将值'设置'为readonly '防止用户'更改,在shell中'无法修改'TMOUT
备注: 默认是'0',代表永'不'自动退出
② SHLV1
功能: 统计'bash实例'的个数
应用: 比较'脚本的不同执行方式'差异性,脚本中'打印'该变量与'终端对比'
③ PS4
开启'追踪时'使用的'调试提示符串',默认值是'+',需要追踪可用 'set -x' 开启
+++++++++'改变脚本调试的行径'++++++++
set -x xtrace
export PS4='+{\$LINENO:${FUNCNAME[0]}} '
效果: 能在'每一条实际执行'的命令前面'显示其行号'以及'所属的函数名'
④ PATH
特点: 系统'查找命令'的路径
脚本: 常常'只写'命令的'相对路径'
备注: linux是'多人'环境,每个人可能会在'PATH'里面加上自定义的目录或文件;为了'避免'出现'意外'情况,最好在脚本中'重新'定义'PATH'路径
⑤ LANG
Centos7 中没有 /etc/sysconfig/i18n 如何永久修改当前系统语言
⑥ IFS
特点: 输入域分隔符('input field separate'),是bash内部'字段分隔符'的环境变量,当shell'读取输入'时,用来'分隔单词'的一组字符,'绝大多数'时候默认是采用'空格'作为分隔符,有些时候遇到'制表符'、'换行符'也会进行分隔
1)IFS 是一种 'set' 变量,当 shell 处理"命令替换"和"参数替换"时,shell 根据 IFS 的值,来'拆解'读入的变量,然后'对特殊字符'进行处理,最后'重新组合'赋值给该变量
2)默认是 'space', tab, newline
细节: 对'空格处理'有点不一样,对行首和行尾'两边的空格'不处理,并且'多个连续的空格'默认当作'一个'空格
应用场景: 有些时候在编写脚本或'执行循环'的时候,'修改IFS'可以起很大作用
注意事项: 如果'要修改'IFS,最好记得'先备份'系统IFS,再需要的地方'再还原'IFS
⑦ REPLY
说明: 与read命令强相关,默认的'内置变量'保存传入的数据
⑧ SECONDS
⑨ SHELLOPTS
⑩ DIRSTACK
它显示目录栈的'栈顶值',和我们常见的栈一样为'先进先出',拥有'入栈'和'出栈'两个动作
'关联'的三个命令:dirs、popd、pushd
⑪ 其它
1. HOME
2. SHELL-->'当前shell类型'
3. HOSTNAME-->'主机名,同hostname命令'
4. PPID -->'是当前进程的父进程的PID'
5. shell带有'内置函数RANDOM'可以随机生成'随机数其范围'为:0~32767
(2)自定义环境变量
++++++++'思考'++++++++
1)如何'how'定义
2)在'哪(where)'定义,对应的'影响' -->'后续讲解'
① 三种方式
1)export JAVA_HOME='/home/kiosk/Development/JDK/jdk1.8.0_202' -->'常见'的方式
2)JAVA_HOME='/home/kiosk/Development/JDK/jdk1.8.0_202';export JAVA_HOME -->'先'定义、'再'声明
3)declare -x JAVA_HOME='/home/kiosk/Development/JDK/jdk1.8.0_202' -->'了解即可'
备注: 声明一个变量作为脚本的'环境变量'而被'导出' -->(x=e'x'port)
二 3个命令显示变量
(1)set
备注: 一次可以'设置多个'参数
① 不带参数
显示所有的变量('全局'、'局部')和'函数' -->'不常用'
② -o参数
功能: 显示 'bash shell' 的所有'参数配置'信息
③ -e参数
++++++++++++'set -e'++++++++++++
含义: '-e参数'表示只要shell脚本中'发生错误',即命令返回值'不等于0',则'停止执行并退出'shell
场景: set -e在shell'脚本'中'经常使用'
默认: shell脚本'碰到错误'会'报错',但会'继续执行后面'的命令
关闭: 'set +e'表示关闭
打开: 'set -e'表示打开
④ -u参数
-u参数表示shell'脚本执行'时,如果遇到'不存在的变量'会'报错'并'停止'执行
备注: 默认'不加-u参数'的情况下,shell脚本遇到'不存在'的变量不会报错,会'继续执行'
⑤ -x参数
-x 执行指令后,会'先显示'该指令及所下的参数
特点: set -x 会在'执行每一行' shell 脚本时,把'执行的内容输出来'
备注: 它可以让你'看到当前执行'的情况,里面'涉及的变量'也会被'替换成实际'的值
结合: 'PS4'和'set-x'结合
(2)env
特点: 只显示'全局'变量
(3)declare
特点: 除了'所有的变量'外,还有'函数'、'整数'
declare -r var -->'readonly' -->'只读'
declare -x var=10 -->'export' -->'全局' -->'字符串类型'
declare -a array -->'定义一个数组' -->'数组'
declare -i integer -->'整数'
三 变量的类型
说明: '默认'情况bash'不会区分'变量类型
shell中变量有'哪些'类型: '整数'、'小数'、'字符串'(最常见的)、'数组(关联数组)'
① 整数
declare -i integer=10
② 小数
脚本中'无法定义'小数,,单bc能'计算'小数
方法'一':使用bc计算器
方法'二':使用awk
方法'三':使用expr
数组元素的'下标'由'0'开始,
③ 数组
declare -a array -->'定义一个数组' -->'数组'
declare -A array -->'关联数组' -->'类似python的字典'
read -a array -->'接收一个数组变量'
array=($(ls /home) -->'动态定义数组'
array=(20 56 "http://c.biancheng.net/shell/") -->它并'不要求'所有数组元素的'类型'必须相同 -->'弱类型'
四 变量的加载顺序
说明:以'centos7.7'为例;核心是'看懂'脚本,进而了解'加载'顺序
(1)系统运行shell的方式
① 通过系统用户登陆后默认运行的shell
理解: 开机,启动'centos7'系统,加载'环境变量'的行为
1)全局系统级别
首先:全局的加载-->'/etc/profile',根据该文件再去'加载/ect/profile.d/*.sh'
2)用户级别
其次:'用户级别'的,具体'哪个用户'登陆 -->'~/.bash_profile',根据该文件读取'~/.bashrc',然后才去找'/etc/bashrc'
② 非登陆交互式运行的shell
场景: 手动'输入bash'时的启动、'su切换用户身份'时候、'远程ssh连接'的时候
特点: 仅仅首先'加载用户级别'的环境变量配置文件(~/.bashrc)
+++++++++++'细节对比'+++++++++++
1) ~/.bash_profile是'交互式login'方式进入bash shell运行
2) ~/.bashrc是'交互式non-login'方式进入bash shell运行
通俗点说: 就是.bash_profile文件只会在'用户登录'的时候读取一次,而'.bashrc'在每次'打开终端'进行'一次新的会话'时都会读取
③ 执行脚本运行的非交互shell
④ 其它方式
五 变量的操作
① 定义
+++++++++'特殊定义'+++++++++
1)涉及'反引号``、()'命令,然后赋值变量场景
2)'函数调用'返回值
++++++++++'修饰符'++++++++++
local --> 'function内部定义'
readonly --> '定义一些常量,一般变量名大写'
1)只读
2)local
#!/bin/bash
#local一般用于'局部变量'声明,多在在'函数内部'使用
fun()
{
local var=1
}
fun
echo $var
对比: 去掉'local修饰'看输出结果
② 删除
unset-->取消变量,只需要变量名即可
unset var
备注: 可以'只删除'数组的一个元素
③ 修改
④ 查看
1)echo
+++++++++++++'核心关注两点'+++++++++++++
1)关于'颜色'
2)双引号,可以'内嵌套'变量
3)使用哪些'转义字符' -->开启'-e'选项
2)printf
理解: C遗留的,可以控制'输出格式',功能'更强大'
备注: 一般'输出报表',会使用'\t'