Shell变量
1、位置变量
$1-$n,需要注意从第10个开始写成${10},${20}
shift可对位置变量控制,如:
#!/bin/sh echo "1:$1" shift echo "2:$2" shift echo "3:$3" # sh test.sh a b c 1:a 2:c 3:
每次执行一次shift命令,位置变量个数会减一,而变量值则提前一位。shift n,可设置向前移动n位。
2、特殊变量
$0 # 脚本自身名字 $? # 返回上一次命令是否执行成功,0为执行成功,非0则为执行失败 $# # 位置参数总数 $* # 所有的位置参数被看做一个字符串 $@ # 每个位置参数被看做独立的字符串 $$ # 当前进程PID
3、变量引用
# 变量值叠加:+= for (( i = 0; i < 3; i++ )); do A+=$i;done;echo $A
#!/bin/sh VAR="/var/lib/systemd /var/lib/logrotate /var/lib/rsyslog" for i in $VAR; do RES+=$(ls $i)\\t0\\n done echo -e $RES
3.1、自定义变量与引用
有时个别特殊字符会影响正常引用,那么需要使用${VAR},如:
# VAR=123
# echo $VAR_ Shell允许VAR_为变量名,所以Shell认为这是个有效的变量名,故不会输出123
# echo ${VAR}_
123_
# echo $VAR456 变量名与其它字符串紧挨着也会认为是整个变量
# echo ${VAR}456
123456
3.2、将命令结果作为变量值
# VAR=`echo 123`
# echo $VAR
123
# VAR=$(echo 123)
123
反引号等效于$( ),都是用于执行Shell命令
3.3、双引号和单引号
# N=3
# VAR="1 2 $N"
# echo $VAR
1 2 3
# N=3
# VAR='1 2 $N'
# echo $VAR
1 2 $N
单引号忽略特殊字符,面双引号则解释特殊符号原有的意义,比如$、!
4、变量字符串截取
4.1、获取变量字符串长度
# VAR='hello world!'
# echo $VAR
hello world!
# echo ${#VAR}(注:空格也算一个字符串)
12
4.2、变量字符串切片
注意:起始字符的索引从0开始计数(从前面和从后面都是从0开始计数)
#VAR='hello world!'
#echo ${VAR:0:5} 截取hello字符串(从0开始到第五个字符)(不包括第五个字符)
hello
#echo ${VAR:0-6:5} 截取world字符串(从倒数第六个字符开始向后数五个字符)
world
#echo ${VAR:0-1} 保留最后一个字符串
!
#echo ${VAR:0} 截取所有字符
hello world!
4.3、替换变量字符串
#VAR='hello world world!'
#echo ${VAR/world/WORLD} 将第一个字符串替换为WORLD
hello WORLD world!
#echo ${VAR//world/WORLD} 将全部world字符串替换为WORLD
hello WORLD WORLD!
4.4、变量字符串截取
#:去掉左边,从左边匹配第一个,##从右边匹配第一个。
%:去掉右边,从右边匹配第一个,%%从左边匹配第一个。
注:有*号情况下才这样
#URL="http://www.baidu.com/baike/user.html"
#echo ${URL#*//} 一个#表示从左到右最短匹配
www.baidu.com/baike/user.html
#echo ${URL##*/} 两个#表示从左到右最长匹配
user.html
#echo ${URL%/*} 一个%表示从右到左最短匹配
http://www.baidu.com/baike
#echo ${URL%%//*} 两个%%表示从右到左最长匹配
http:
#echo ${URL%.*} 以. 为分隔符截取左边
http://www.baidu.com/baike/user
#echo ${URL##*.} 以. 为分隔符截取右边
html
# 注:在有*号的情况下才适应以下规则 # URL="http://www.baidu.com/baike/user.html" # 一个#表示从左到右最短匹配,截取右边 # echo ${URL#*/} www.baidu.com/baike/user.html # 两个#表示从左到右最长匹配,截取右边 # echo ${URL##*/} user.html # 以. 为分隔符截取右边 # echo ${URL##*.} html # 一个%表示从右到左最短匹配,截取左边 # echo ${URL%/*} http://www.baidu.com/baike # 两个%表示从右到左最长匹配,截取左边 # echo ${URL%%/*} http: # 以. 为分隔符截取左边 # echo ${URL%.*} http://www.baidu.com/baike/user # 以\n为分隔符截取左边,删除变量最后一行 # VAR="line1\nline2\nline3" # echo "${VAR%'\n'*}" line1\nline2
表达式含义:VAR=abcABC123abc
${VAR} 返回变量的内容
${#VAR} 返回变量的字符长度
${VAR:1} 保留第二个到最后一个字符
${VAR:1:3} 1表示从左边第二个字符开始,3表示字符的总个数
${VAR#a*c} 删除最短匹配从a开始到c结束的字符,*为所有字符
${VAR##a*c} 删除最长匹配从a开始到c结束的字符,*为所有字符
${VAR%a*c} 从未尾开始删除最短a开始到c结束的字符
${VAR%%a*c} 从未尾开始删除最长a开始到c结束的字符
${VAR/abc/ABC} 替换第一个匹配的abc
${VAR//abc/ABC} 替换所有的abc
5、变量状态赋值
${VAR:-string} 如果VAR变量为空则返回string
${VAR:+string} 如果VAR变量不为空则返回string
${VAR:=string} 如果VAR变量为空则重新赋值VAR变量为string
${VAR:?string} 如果VAR变量为空则将{ }里的内容输出
#VAR=
#echo ${VAR:-'hello world!'}
hello world!
#VAR="hello"
#echo ${VAR:+'hello world!'}
hello world!
#VAR=
#echo ${VAR:=hello}
hello
#echo $VAR
hello
#VAR=
#echo ${VAR:?value is null}
-bash: VAR: value is null
6、内置变量
$FUNCNAME:表示获取当前函数的名字,作用范围仅限函数中使用,在函数外无值
$LINENO:表示获取当前所在脚本中变量出现在的行号
$PWD:表示获取当前目录, 对应于pwd命令
$$:表示获取当前进程ID
$PPID:表示获取父进程ID
$HOME:表示获取用户home目录
$USER:表示获取当前用户名
$UID:表示获取当前用户ID
$GROUPS:表示获取当前用户组ID
$HOSTTYPE
$MACTYPE
$OSTYPE
浙公网安备 33010602011771号