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

 

posted @ 2018-10-21 00:40  風£飛  阅读(186)  评论(0)    收藏  举报