Shell入门-Shell变量
Shell变量
本篇包含的内容:
- 变量的类型及变量的赋值方式
- 显示与取消环境变量
- Shell中单引号、双引号、反引号的区别
- Shell中的特殊位置参数变量
- Shell中特殊状态变量
- Shell内置命令
- Shell变量子串及特殊扩展命令
变量类型
变量可分为两类:环境变量(全局变量)和普通变量(局部变量)。
环境变量一般是指用export内置命令导出的变量。
按照系统规范,所有环境变量的名字均采用大写形式。例如:正确的环境变量定义方法为export OLDGIRL=1
。
在查看设置的变量时,有3个命令可以显示变量的值:set、env和declare
(替代早期的typeset)。set命令输出所有的变量,包括全局变量和局部变量;env命令只显示全局变量;declare命令输出所有的变量、函数、整数和已经导出的变量。set -o
命令显示bash Shell的所有参数配置信息
赋值方式
先写变量名称,紧接着是“=”这个字符,最后是值,中间无任何空格。
[root@localhost shell]# oldboy="iam oldboy"
[root@localhost shell]# echo $oldboy
iam oldboy
[root@localhost shell]# echo $oldboy
iam oldboy
[root@localhost shell]# oldboy1 = "iam oldboy"
-bash: oldboy1: 未找到命令
[root@localhost shell]#
设置登录提示的两种方式
-
/etc/motd中添加描述,
welcome to tianhao linux shell training....
连接成功 Last login: Thu Mar 4 21:56:02 2021 from 192.168.15.1 welcome to tianhao linux shell training.... [root@localhost ~]#
-
/etc/profile.d/添加脚本,如test.sh,内容为
echo "this is tianhao training"
[root@localhost ~]# echo echo "here is tianhao training" > /etc/profile.d/tianhao.sh 连接成功 Last login: Thu Mar 4 22:11:22 2021 from 192.168.15.1 welcome to tianhao linux shell training.... here is tianhao training [root@localhost ~]#
显示与取消环境变量
- $HOME:用户登录时进入的目录。
- $UID:当前用户的UID(用户标识),相当于id -u。
- $PWD:当前工作目录的绝对路径名。
- $SHELL:当前SHELL。
- $USER:当前用户。
[root@localhost ~]# echo $HOME
/root
[root@localhost ~]# echo $UID
0
[root@localhost ~]# echo $PWD
/root
[root@localhost ~]# echo $SHELL
/bin/bash
[root@localhost ~]# echo $USER
root
[root@localhost ~]#
取消本地变量和环境变量
root
[root@localhost ~]# unset USER
[root@localhost ~]# echo $USER
[root@localhost ~]#
本地变量
定义普通变量有三种方式
- 变量名=value
- 变量名='value'
- 变量名="value"
$变量名
表示输出变量,可以用$c和${c}
两种用法。例如:
[root@localhost shell]# cat var-learn01.sh
#!/bin/bash
#***********************************************
#Author: luotianhao
#Mail: tianhao.luo@hand-china.com
#Version: 1.0
#Date: 2021-03-04
#FileName: var-learn01.sh
#Description: This is a test script.
#***********************************************
a=192.168.15.79
b='192.168.15.79'
c="192.168.15.79"
echo "a=$a"
echo "b=$b"
echo "c=${c}"
[root@localhost shell]# sh var-learn01.sh
a=192.168.15.79
b=192.168.15.79
c=192.168.15.79
将连续的普通字符串的内容赋值给变量,不管用不用引号,或者不管用什么引号,它的内容是什么,打印变量时就会输出什么。
现在我们不单纯使用字符串了,添加了一些变量。例如:
[root@localhost shell]# cat var-learn02.sh
#!/bin/bash
#***********************************************
#Author: luotianhao
#Mail: tianhao.luo@hand-china.com
#Version: 1.0
#Date: 2021-03-04
#FileName: var-learn02.sh
#Description: This is a test script.
#***********************************************
d=192.168.15.79-$d
e='192.168.15.79-$d'
f="192.168.15.79-$d"
echo "d=$d"
echo "e=$e"
echo "f=${f}"
[root@localhost shell]# sh var-learn02.sh
d=192.168.15.79-
e=192.168.15.79-$d
f=192.168.15.79-192.168.15.79-
能发现:①不加引号时,变量中引用变量,引用的变量无值则输出为空②加单引号,变量中引用变量,输出的是变量名③使用双引号,可以输出被引用的变量
把一个命令的结果作为变量的内容赋值的方法:
- 使用反引号包裹命令
- 使用$()包裹命令。
一个按天打包网站的示例:①定义一个CMD的变量,变量的值是date +%F
输出的结果(使用$()包裹)②使用反引号包裹变量的输出作为压缩包名称
[root@localhost shell]# CMD=$(date +%F)
[root@localhost shell]# echo $CMD
2021-03-04
[root@localhost shell]# echo `date +%F`.tar.gz
2021-03-04.tar.gz
[root@localhost shell]# tar zcf etc_$(date +%F).tar.gz /etc
tar: 从成员名中删除开头的“/”
[root@localhost shell]# ls -l etc_2021-03-04.tar.gz
-rw-r--r-- 1 root root 11403065 3月 4 22:44 etc_2021-03-04.tar.gz
[root@localhost shell]# H=$(uname -n)
[root@localhost shell]# echo $H
localhost.localdomain
[root@localhost shell]# tar zcf $H.tar.gz /etc/services
tar: 从成员名中删除开头的“/”
[root@localhost shell]# ls -l localhost.localdomain.tar.gz
-rw-r--r-- 1 root root 136214 3月 4 22:45 localhost.localdomain.tar.gz
[root@localhost shell]#
Shell中单引号、双引号、反引号与不加引号的区别
- 单引号:所见即所得(引号内是什么输出什么),被称为强引用。
- 双引号:如果内容中有命令(反引号)、变量、特殊转义符等,会先把变量、命令、转义符解析输出结果,然后再输出最终内容,被称为弱引用
- 无引号:变量内容中如果有空格,会造成赋值不完整。而在输出内容时,会将含有空格的字符串视为一个整体来输出;如果内容中有命令(反引号)、变量等,则会先把变量、命令解析出结果,然后输出最终内容;如果字符串中带有空格等特殊字符,则有可能无法完整地输出,因此需要改加双引号。一般连续的字符串、数字、路径等可以不加任何引号进行赋值和输出,不过最好是用双引号替代无引号的情况,特别是对变量赋值时
- 反引号:相当于
$()
,赋值和输出时都要用反引号或$()
将命令引起来
awk命令中使用单引号、双引号、反引号
- 单引号:是纯字符串输出解析后的结果;被单引号/双引号包裹的字符串则输出空;被反引号包裹的输出报错
- 双引号:纯字符串/单引号/双音好包裹输出引号内容本身
- 双引号+单引号:输出引用
- 无引号:输出空
[root@localhost ~]# ETT=123
[root@localhost ~]# awk 'BEGIN {print "$ETT"}'
$ETT
[root@localhost ~]# awk 'BEGIN {print $ETT}'
[root@localhost ~]# awk 'BEGIN {print '$ETT'}'
123
[root@localhost ~]# awk 'BEGIN {print "'$ETT'"}'
123
[root@localhost ~]# ETT='oldgirl'
[root@localhost ~]# awk 'BEGIN {print "$ETT"}'
$ETT
[root@localhost ~]# awk 'BEGIN {print $ETT}'
[root@localhost ~]# awk 'BEGIN {print "'$ETT'"}'
oldgirl
[root@localhost ~]# awk 'BEGIN {print '$ETT'}'
[root@localhost ~]# ETT="tingting"
[root@localhost ~]# awk 'BEGIN {print "$ETT"}'
$ETT
[root@localhost ~]# awk 'BEGIN {print $ETT}'
[root@localhost ~]# awk 'BEGIN {print '$ETT'}'
[root@localhost ~]# awk 'BEGIN {print "'$ETT'"}'
tingting
[root@localhost ~]# ETT=`pwd`
[root@localhost ~]# echo $ETT
/root
[root@localhost ~]# awk 'BEGIN {print "$ETT"}'
$ETT
[root@localhost ~]# awk 'BEGIN {print $ETT}'
[root@localhost ~]# awk 'BEGIN {print '$ETT'}'
awk: cmd. line:1: BEGIN {print /root}
awk: cmd. line:1: ^ unterminated regexp
awk: cmd. line:1: BEGIN {print /root}
awk: cmd. line:1: ^ unexpected newline or end of string
[root@localhost ~]# awk 'BEGIN {print "'$ETT'"}'
/root
[root@localhost ~]#
不管变量如何定义、赋值,除了加单引号以外,利用awk直接获取变量的输出,结果都是一样的,因此,在awk取用Shell变量时,我们更多地还是喜欢先用echo加符号输出变量,然后通过管道给awk,进而控制变量的输出结果。
[root@localhost ~]# ETT="oldgirl"
[root@localhost ~]# echo "$ETT"|awk '{print $0}'
oldgirl
[root@localhost ~]# echo '$ETT'|awk '{print $0}'
$ETT
[root@localhost ~]# ETT=`pwd`
[root@localhost ~]# echo "$ETT"|awk '{print $0}'
/root
[root@localhost ~]# echo '$ETT'|awk '{print $0}'
$ETT
[root@localhost ~]# echo $ETT|awk '{print $0}'
/root
[root@localhost ~]#
这就符合前面给出的普通情况的结论了。
sed指定变量关键字过滤
[root@localhost shell]# echo testchars > sed.log
[root@localhost shell]# cat sed.log
testchars
[root@localhost shell]# echo oldboy >> sed.log
[root@localhost shell]# cat sed.log
testchars
oldboy
[root@localhost shell]# sed -n /$OLDBOY/p sed.log
testchars
[root@localhost shell]# echo $OLDBOY
testchars
[root@localhost shell]# sed -n /"$OLDBOY"/p sed.log
testchars
[root@localhost shell]# sed -n /'$OLDBOY'/p sed.log
[root@localhost shell]#
sed和grep的测试和前面结论是相符的,唯有awk有些特殊。
自定义普通字符串变量的建议
- 内容是纯数字、简单的连续字符(内容中不带任何空格)时,定义时可以不加任何引号
- 没有特殊情况时,字符串一律用双引号定义赋值,特别是多个字符串中间有空格时
- 当变量里的内容需要原样输出时,要用单引号(''),这样的需求极少
Shell中的特殊位置参数变量
$0
:获取当前执行的Shell脚本的文件名,如果执行脚本包含了路径,那么就包括脚本路径$n
:获取当前执行的Shell脚本的第n个参数值,n=1..9,当n=0时表示脚本的文件名;如果n大于9,则用大括号括起来,例如${10}
$#
:获取当前执行的Shell脚本后面接的参数总个数$*
:获取当前Shell脚本所有传参的参数,不加引号和$@
相同;如果加上双引号,则表示所有的参数视为单个字符串,相当于"$1 $2 $3"
$@
:获取当前Shell脚本所有传参的参数,不加引号和$*
相同。如果给$@
加上双引号,例如:"$@"
,则表示将所有的参数视为不同的独立字符串,相当于"$1" "$2" "$3" "$..."
。
使用$1
[root@localhost shell]# echo 'echo $1' >p.sh
[root@localhost shell]# cat p.sh
echo $1
[root@localhost shell]# sh p.sh lth
lth
[root@localhost shell]# sh p.sh lth 22
lth
[root@localhost shell]# sh p.sh "lth 22"
lth 22
[root@localhost shell]#
[root@localhost shell]# echo 'echo $1 $2'>p.sh
[root@localhost shell]# cat p.sh
echo $1 $2
[root@localhost shell]# sh p.sh longge bingbing
longge bingbing
[root@localhost shell]# sh p.sh "longge bingbing" oldgirl
longge bingbing oldgirl
设置多个参数的小技巧:echo \${1..15}
。能发现在位置参数数字大于9之后,输出的内容出现了异常。
[root@localhost shell]# echo \${1..15}
$1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $11 $12 $13 $14 $15
[root@localhost shell]# echo \${1..15} >n.sh
[root@localhost shell]# cat n.sh
$1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $11 $12 $13 $14 $15
[root@localhost shell]# vim n.sh
[root@localhost shell]# cat n.sh
echo $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $11 $12 $13 $14 $15
[root@localhost shell]# echo {a..z}
a b c d e f g h i j k l m n o p q r s t u v w x y z
[root@localhost shell]# sh n.sh (a..z)
-bash: 未预期的符号 `(' 附近有语法错误
[root@localhost shell]# sh n.sh ${a..z}
-bash: ${a..z}: 坏的替换
[root@localhost shell]# sh n.sh {a..z}
a b c d e f g h i a0 a1 a2 a3 a4 a5
[root@localhost shell]#
当把位置参数数字大于9的加上{}之后,输出的内容正常。
[root@localhost shell]# vim n.sh
[root@localhost shell]# sh n.sh {a..z}
a b c d e f g h i j k l m n o
[root@localhost shell]# cat n.sh
echo $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11} ${12} ${13} ${14} ${15}
创建一个使用了$0
的脚本
[root@localhost shell]# echo 'echo $0'>n.sh
[root@localhost shell]# sh n.sh
n.sh
[root@localhost shell]# sh /u01/learn/shell/n.sh
/u01/learn/shell/n.sh
[root@localhost shell]#
[root@localhost shell]# dirname n.sh
.
[root@localhost shell]# dirname /u01/learn/shell/n.sh
/u01/learn/shell
[root@localhost shell]# basename /u01/learn/shell/n.sh
n.sh
[root@localhost shell]#
根据用户输入的变量数来决定是否要打印异常并结束
[root@localhost shell]# cat tl.sh
#!/bin/bash
#***********************************************
#Author: luotianhao
#Mail: tianhao.luo@hand-china.com
#Version: 1.0
#Date: 2021-03-05
#FileName: tl.sh
#Description: This is a test script.
#***********************************************
[ $# -ne 2 ] && {
echo "must two args"
exit 1
}
echo oldgirl
[root@localhost shell]# vim tl.sh
[root@localhost shell]# sh tl.sh
must two args
[root@localhost shell]# sh tl.sh arg1 arg2
oldgirl
if判断语句的写法,注意then跟的位置,如果直接跟在if后中括号后会直接报错
[root@localhost shell]# cat t2.sh
#!/bin/bash
#***********************************************
#Author: luotianhao
#Mail: tianhao.luo@hand-china.com
#Version: 1.0
#Date: 2021-03-05
#FileName: t2.sh
#Description: This is a test script.
#***********************************************
if [ $# -ne 2 ]
then
echo "USAGE:/bin/bash $0 arg1 arg2"
exit 1
fi
echo $1 $2
[root@localhost shell]# sh t2.sh
USAGE:/bin/bash t2.sh arg1 arg2
[root@localhost shell]# cat t2.sh
#!/bin/bash
#***********************************************
#Author: luotianhao
#Mail: tianhao.luo@hand-china.com
#Version: 1.0
#Date: 2021-03-05
#FileName: t2.sh
#Description: This is a test script.
#***********************************************
if [ $# -ne 2 ] then
echo "USAGE:/bin/bash $0 arg1 arg2"
exit 1
fi
echo $1 $2
[root@localhost shell]# sh t2.sh
t2.sh:行12: 未预期的符号 `fi' 附近有语法错误
t2.sh:行12: `fi'
利用set设置位置参数
[root@localhost shell]# set -- "i am" handsome oldboy
[root@localhost shell]# echo $#
3
[root@localhost shell]# echo $1
i am
[root@localhost shell]# echo $2
handsome
[root@localhost shell]# echo $3
oldboy
[root@localhost shell]# echo $*
i am handsome oldboy
[root@localhost shell]# echo $@
i am handsome oldboy
[root@localhost shell]# for i in $*;do echo $i;done
i
am
handsome
oldboy
[root@localhost shell]# for i in $@;do echo $i;done
i
am
handsome
oldboy
[root@localhost shell]# for i in "$*";do echo $i;done
i am handsome oldboy
[root@localhost shell]# for i in "$@";do echo $i;done
i am
handsome
oldboy
[root@localhost shell]#
Shell特殊状态变量
$?
:获取上一个指令执行的状态返回值(0为成功,非0为失败)。可用来判断安装软件/打包是否成功$$
:获取执行当前Shell脚本的进程号$!
:获取上一个在后台工作的进程的进程号$_
:获取在此之前执行的命令或脚本的最后一个参数
bash Shell内置命令
-
echo在屏幕上输出信息,echo参数选项如下:
-
-n 不换行输出内容
-
-e 解析转义字符
转义字符:
- \n 换行
- \r 回车
- \t tab
- \b 退格
- \v 纵向制表符
[root@localhost shell]# echo oldboy;echo oldgirl oldboy oldgirl [root@localhost shell]# echo -n oldboy;echo oldgirl oldboyoldgirl [root@localhost shell]# echo "oldboy\toldgirl\noldboy\toldgirl" oldboy\toldgirl\noldboy\toldgirl [root@localhost shell]# echo -e "oldboy\toldgirl\noldboy\toldgirl" oldboy oldgirl oldboy oldgirl [root@localhost shell]#
-
-
eval ,当Shell程序执行到eval语句时,Shell读入参数args,并将它们组合成一个新的命令,然后执行
[root@localhost shell]# echo 'echo \$$#'>noeval.sh [root@localhost shell]# sh noeval.sh arg1 arg2 $2 [root@localhost shell]# echo 'eval "echo \$$#"'>eval.sh [root@localhost shell]# sh eval.sh arg1 arg2 arg2 [root@localhost shell]#
Shell变量子串
${parameter}
:返回变量$parameter
的内容${#parameter}
:返回变量$parameter
内容的长度(按字符),也适用于特殊变量${parameter.offset}
:在变量${parameter}
中,从位置offset之后开始提取子串到结尾${parameter:offset:length}
:在变量${parameter}
中,从位置offset之后开始提取长度未length的子串${parameter#word}
:从变量${parameter}
开头开始删除最短匹配的word子串${parameter##word}
:从变量${parameter}
开头开始删除最长匹配的word子串${parameter%word}
:从变量${parameter}
结尾开始删除最短匹配的word子串${parameter%%word}
:从变量${parameter}
结尾开始删除最长匹配的word子串${parameter/pattern/string}
:使用string代替第一个匹配的pattern${parameter//pattern/string}
:使用string代替所有匹配的pattern
打印变量值的长度:
[root@localhost shell]# OLDBOY="i am oldboy"
[root@localhost shell]# echo $OLDBOY
i am oldboy
[root@localhost shell]# echo ${#OLDBOY}
11
[root@localhost shell]# echo $OLDBOY|wc -L
11
[root@localhost shell]# expr length "$OLDBOY"
11
[root@localhost shell]# echo "$OLDBOY"|awk '{print length($0)}'
11
[root@localhost shell]#
截取字符串
[root@localhost shell]# OLDBOY="i am oldboy"
[root@localhost shell]# echo $OLDBOY
i am oldboy
[root@localhost shell]# echo ${OLDBOY:2}
am oldboy
[root@localhost shell]# echo ${OLDBOY:2:2}
am
[root@localhost shell]# echo ${OLDBOY}|cut -c 3-4
am
删除最短匹配a*c
字符,并输出剩余的字符
a*c
表示匹配的字符串,*
表示匹配所有,a*c
匹配开头为a
、中间为任意多个字符、结尾为c
的字符串。
[root@localhost shell]# OLDBOY=abcABC123ABCabc
[root@localhost shell]# echo $OLDBOY
abcABC123ABCabc
[root@localhost shell]# echo ${OLDBOY# a*c}
abcABC123ABCabc
[root@localhost shell]# echo ${OLDBOY#a*c}
ABC123ABCabc
[root@localhost shell]#
删除最长匹配a*C
字符,并输出剩余的字符
[root@localhost shell]# OLDBOY=abcABC123ABCabc
[root@localhost shell]# echo $OLDBOY
abcABC123ABCabc
[root@localhost shell]# echo ${OLDBOY##a*c}
[root@localhost shell]# echo ${OLDBOY##a*C}
abc
[root@localhost shell]#
从结尾开始删除最短匹配的子串
[root@localhost shell]# OLDBOY=abcABC123ABCabc
[root@localhost shell]# echo $OLDBOY
abcABC123ABCabc
[root@localhost shell]# echo ${OLDBOY%a*C}
abcABC123ABCabc
[root@localhost shell]# echo ${OLDBOY%a*c}
abcABC123ABC
[root@localhost shell]#
从结尾开始删除最长匹配的子串
[root@localhost shell]# echo ${OLDBOY}
abcABC123ABCabc
[root@localhost shell]# echo ${OLDBOY%%a*C}
abcABC123ABCabc
[root@localhost shell]# echo ${OLDBOY%%a*c}
[root@localhost shell]#
替换指定的字符串
[root@localhost shell]# OLDBOY="i am oldboy,yes,oldboy"
[root@localhost shell]# echo $OLDBOY
i am oldboy,yes,oldboy
[root@localhost shell]# echo ${OLDBOY/oldboy/oldgirl}
i am oldgirl,yes,oldboy
[root@localhost shell]# echo ${OLDBOY//oldboy/oldgirl}
i am oldgirl,yes,oldgirl
[root@localhost shell]#
实例:批量修改文件名
[root@localhost shell]# echo '1' >stu_102999_1_finished.txt
[root@localhost shell]# echo '2' >stu_102999_2_finished.txt
[root@localhost shell]# echo '3' >stu_102999_3_finished.txt
[root@localhost shell]# echo '4' >stu_102999_4_finished.txt
[root@localhost shell]# ls -l *.txt
-rw-r--r-- 1 root root 2 3月 7 15:59 stu_102999_1_finished.txt
-rw-r--r-- 1 root root 2 3月 7 15:59 stu_102999_2_finished.txt
-rw-r--r-- 1 root root 2 3月 7 15:59 stu_102999_3_finished.txt
-rw-r--r-- 1 root root 2 3月 7 15:59 stu_102999_4_finished.txt
[root@localhost shell]# #>我们先尝试修改一个文件
[root@localhost shell]# F=stu_102999_1_finished.txt
[root@localhost shell]# echo ${F//_finished/}
stu_102999_1.txt
[root@localhost shell]# mv $F $(echo ${F//_finished/})
[root@localhost shell]# ls -l *.txt
-rw-r--r-- 1 root root 2 3月 7 15:59 stu_102999_1.txt
-rw-r--r-- 1 root root 2 3月 7 15:59 stu_102999_2_finished.txt
-rw-r--r-- 1 root root 2 3月 7 15:59 stu_102999_3_finished.txt
-rw-r--r-- 1 root root 2 3月 7 15:59 stu_102999_4_finished.txt
[root@localhost shell]# #>循环批量处理
[root@localhost shell]# for F in $(ls *fin*.txt);do mv $F $(echo ${F//_finished/});done
[root@localhost shell]# ls -l *.txt
-rw-r--r-- 1 root root 2 3月 7 15:59 stu_102999_1.txt
-rw-r--r-- 1 root root 2 3月 7 15:59 stu_102999_2.txt
-rw-r--r-- 1 root root 2 3月 7 15:59 stu_102999_3.txt
-rw-r--r-- 1 root root 2 3月 7 15:59 stu_102999_4.txt
Shell特殊扩展变量
-
${parameter:-word}
:如果parameter变量值为空或未赋值,则会返回word字符串替代变量的值[root@localhost shell]# echo $test [root@localhost shell]# result=${rest:-UNSET} [root@localhost shell]# echo $result UNSET [root@localhost shell]# echo ${test} [root@localhost shell]#
-
${parameter:=word}
:如果parameter变量值为空或未赋值,就设置这个变量值为word,并返回其值。位置变量和特殊便令不适用。这个变量的功能可以解决变量没有定义的问题,并确保没有定义的变量始终有值。[root@localhost shell]# unset result [root@localhost shell]# echo $result [root@localhost shell]# echo $test oldboy [root@localhost shell]# unset test [root@localhost shell]# result=${test:=UNSET} [root@localhost shell]# echo $result UNSET [root@localhost shell]# result=${test=UNSET} [root@localhost shell]# echo $test UNSET [root@localhost shell]#
-
${parameter:?word}
:可以用于设定由于变量未定义而报错的具体内容,如:“not defined”[root@localhost shell]# echo ${key:? not defined} -bash: key: not defined [root@localhost shell]# echo ${key? not defined} -bash: key: not defined [root@localhost shell]# key=1 [root@localhost shell]# echo ${key:? not defined} 1 [root@localhost shell]# echo ${key? not defined} 1 [root@localhost shell]# unset key [root@localhost shell]# echo ${key? not defined} -bash: key: not defined [root@localhost shell]# echo ${key:? not defined}
-
${parameter:+word}
:如果parameter变量值为空或未赋值,则什么都不做,否则word字符串将替代变量的值。[root@localhost shell]# oldboy=${oldgirl:+word} [root@localhost shell]# echo $oldboy [root@localhost shell]# oldgirl=19 [root@localhost shell]# oldboy=${oldgirl:+word} [root@localhost shell]# echo $oldboy word [root@localhost shell]#