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
"
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 数字”把这个数字以函数返回值的形式传给“$?”
转义字符
转义字符 |
说明 |
|
换行 |
|
回车 |
|
制表符(tab) |
|
退格 |
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} |