Linux shell变量
- 环境变量(全局变量)
- 普通变量(局部变量)
- 特殊位置参数变量
- shell内置变量(转义字符)
- shell变量子串
环境变量(全局变量)
- 环境变量的名字均采用大写形式
- 环境变量保存在用户家目录下的.bash_profile
- 查看系统所有变量:env、declare、set
- 设置环境变量方法
export NAME=fuge
NAME=fuge ; export NAME
declare -x NAME=fuge
- 永久生效文件:/etc/bashrc、/etc/profile、/etc/profile.d/
echo NAME=liangjingfu >>/etc/bashrc
source /etc/profile
echo $HOME
printf "$HOME\n"
unset HOME
常见环境变量
SHELL=/bin/bash | 登录Shell类型 |
TERM=vt100 | 终端设置 |
HOSTNAME=centos6 | 当前主机名 |
HISTSIZE=1000 | 记录在命令行历史文件中的命令行数 |
USER=root | 当前用户的用户名 |
PATH=/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/root/bin | 全局PATH路径,命令搜索路径。 一个由冒号分隔的目录列表,Shell用它来搜索命令。 |
PWD=/etc | 当前路径 |
LANG=en_US.UTF-8 | 字符集 |
SHLVL=1 | 每启动一个bash实例就将其加1 |
HOME=/root | 当前用户家目录 |
TMOUT=3600 | 退出前等待超时的秒数 |
UID=0 | 当前用户的UID |
普通变量(局部变量)
- 定义方式有四种:单引号、双引号、无引号、反引号
- 单引号:所见即所得,输出时会将单引号内的所有内容都原样输出
- 双引号:输出双引号内的所有内容。会先把变量、命令、转义字符解析出结果,然后再输出最终内容
- 无引号:不建议赋值有空格的内容。会先把变量、命令解析出结果,然后再输出最终内容
- 反引号:用于引用命令,相当于$()
- 变量名一般是由字母、数字、下划线组成
- 变量输出可用$c和${c}
shell脚本普通变量使用建议
- 在脚本中定义普通字符串变量时,应尽量把变量的内容用双引号括起来
- 单纯数字的变量内容可以不加引号
- 希望变量的内容原样输出时需要加单引号
- 希望变量值引用命令并获取命令的结果时就用反引号或$()
特殊位置参数变量
特殊变量
$0 | 获取当前执行的shell脚本的文件名如果执行脚本包含了路径,那么就包含脚本的路径 |
$n | 获取当前执行的shell脚本的第n个参数当n为0时表示脚本的文件名当n大于9,则用大括号括起来,例如${10} |
$# | 获取当前执行的shell脚本后面接的参数的总个数 |
$* | 获取当前shell脚本所有传参的参数"$*",则表示将所有的参数视为单个字符串,相当于"$1 $2 $3" |
$@ | 获取当前shell脚本所有传参的参数"$@",则表示将所有的参数视为不同的独立字符串,相当于"$1" " $2" "$3" |
$? | 获取执行上一个指令的执行状态返回值0为成功,非0位失败 |
$$ | 获取当前执行的Shell脚本的进程号(PID) |
$! | 获取上一个在后台工作的进程和进程号(PID) |
$_ | 获取在此之前执行的命令或脚本的最后一个参数 |
'$?' 返回值的用法如下:
- 判断命令、脚本或函数等程序是否执行成功
- 若在脚本中调用执行“exit 数字”,则会返回这个数字给“$?”变量
- 如果是在函数里,则通过“return 数字”把这个数字以函数返回值的形式传给“$?”
转义字符
\n | 换行 |
\r | 回车 |
\t | 制表符(tab) |
\b | 退格 |
\v | 纵向制表符 |
shell变量子串
${parameter} | 返回变量$parameter的内容 | echo ${HOSTNAME} |
${#parameter} | 返回变量$parameter的内容的长度(按字符),也适用于特殊变量 | echo ${#HOSTNAME} |
${parameter:offset} | 在变量${parameter}中,从位置offset之后开始提取子串到结尾 | echo ${HOSTNAME:2} |
${parameter:offset:length} | 在变量${parameter}中,从位置offset之后开始提取长度为length的子串 | echo ${HOSTNAME:2:2} |
${parameter#word} | 从变量${parameter}开头开始删除最短匹配的word子串 | |
${parameter##word} | 从变量${parameter}开头开始删除最长匹配的word子串 | |
${parameter%word} | 从变量${parameter}结尾开始删除最短匹配的word子串 | |
${parameter%%word} | 从变量${parameter}结尾开始删除最长匹配的word子串 | |
${parameter/pattern/string} | 使用string代替第一个匹配的pattern | test=testabcABC;echo ${test/ng/NG} |
${parameter//pattern/string} | 使用string代替所有匹配的pattern | test=testabcABC;echo ${test//ng/NG} |
${parameter^pattern} | 把变量中的第一个字符换成大写 | test=testabcABC;echo ${test^} |
${parameter^^pattern} | 把变量中的所有小写字母,全部替换为大写。 | test=testabcABC;echo ${test^^} |
${parameter,pattern} | 把变量中的第一个字符换成小写 | test=testabcABC;echo ${test,} |
${parameter,,pattern} | 把变量中的所有大写字母,全部替换为小写。 | test=testabcABC;echo ${test,,} |
${parameter:-word} | 如果parameter的变量值为空或未赋值,则会返回word字符串代替变量的值用途:如果变量未定义,则返回备用的值,防止变量为空值或因未定义而导致异常 | echo ${test:-testabcABC};echo $test |
${parameter:=word} | 如果parameter的变量值为空或未赋值,则设置这个变量未word,并返回其值。位置变量和特殊变量不适用。用途:如果变量未定义,则自动赋值,防止变量为空值或因未定义而导致异常 | echo ${test:=testabcABC};echo $test |
${parameter:?word} | 如果parameter的变量值为空或未赋值,则word字符串将被作为标准错误输出,否则输出变量的值用途:用于捕捉由于变量未定义而导致的错误,并退出程序 | echo ${test:?testabcABC} |
${parameter:+word} | 如果parameter的变量值为空或未赋值,则什么都不做,否则word字符串将代替变量的值 | echo ${test:+testabcABC} |