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、变量引用
赋值运算符:=,两个变量相加:+=
3.1、自定义变量与引用
#VAR=123
#echo $VAR
123
#VAR+=456
#echo $VAR
123456
有时个别特殊字符会影响正常引用,那么需要使用${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
表达式 含义: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