我们在第 3.4.6 节中已经讨论过这个问题。
使用 ${#VAR} 语法将计算变量中的字符数。如果VAR是 "*" 或 "@",则此值将替换为位置参数的数量或一般情况下数组中元素的数量。这在下面的示例中演示。
[bob in ~] echo $SHELL /bin/bash [bob in ~] echo ${#SHELL} 9 [bob in ~] ARRAY=(one two three) [bob in ~] echo ${#ARRAY} 3 |
${VAR:-WORD}
如果VAR未定义或为空,则替换为WORD的扩展;否则,替换为VAR的值
[bob in ~] echo ${TEST:-test} test [bob in ~] echo $TEST [bob in ~] export TEST=a_string [bob in ~] echo ${TEST:-test} a_string [bob in ~] echo ${TEST2:-$TEST} a_string |
这种形式常用于条件测试,例如在下面的例子中
[ -z "${COLUMNS:-}" ] && COLUMNS=80 |
它是以下内容的简写形式
if [ -z "${COLUMNS:-}" ]; then COLUMNS=80 fi |
有关此类条件测试的更多信息,请参阅第 7.1.2.3 节。
如果连字符 (-) 替换为等号 (=),则当参数不存在时,该值将被赋值给参数
[bob in ~] echo $TEST2 [bob in ~] echo ${TEST2:=$TEST} a_string [bob in ~] echo $TEST2 a_string |
以下语法测试变量是否存在。如果未设置,则将WORD的扩展打印到标准输出,并且非交互式 shell 退出。一个演示:
[bob in ~] cat vartest.sh #!/bin/bash # This script tests whether a variable is set. If not, # it exits printing a message. echo ${TESTVAR:?"There's so much I still wanted to do..."} echo "TESTVAR is set, we can proceed." [bob in testdir] ./vartest.sh ./vartest.sh: line 6: TESTVAR: There's so much I still wanted to do... [bob in testdir] export TESTVAR=present [bob in testdir] ./vartest.sh present TESTVAR is set, we can proceed. |
使用 "+" 而不是感叹号会将变量设置为WORD的扩展;如果它不存在,则什么也不会发生。
要从变量中剥离等于OFFSET的字符数,请使用以下语法
${VAR:OFFSET:LENGTH}
参数LENGTH定义了从偏移点之后的第一个字符开始保留多少个字符。如果LENGTH被省略,则取变量内容的其余部分
[bob in ~] export STRING="thisisaverylongname" [bob in ~] echo ${STRING:4} isaverylongname [bob in ~] echo ${STRING:6:5} avery |
${VAR#WORD}
和
${VAR##WORD}
这些构造用于删除与WORD中VAR. WORD的扩展相匹配的模式,就像在文件名扩展中一样。如果模式与VAR的扩展值的开头匹配,则扩展的结果是VAR的扩展值,其中包含最短匹配模式 ("#") 或最长匹配模式(用 "##" 表示)。
如果VAR是*或@,则模式删除操作将依次应用于每个位置参数,并且扩展是结果列表。
如果VAR是使用 "*" 或 "@" 下标的数组变量,则模式删除操作将依次应用于数组的每个成员,并且扩展是结果列表。如下面的示例所示。
[bob in ~] echo ${ARRAY[*]} one two one three one four [bob in ~] echo ${ARRAY[*]#one} two three four [bob in ~] echo ${ARRAY[*]#t} one wo one hree one four [bob in ~] echo ${ARRAY[*]#t*} one wo one hree one four [bob in ~] echo ${ARRAY[*]##t*} one one one four |
使用 "%" 和 "%%" 可以获得相反的效果,如下面的示例所示。WORD应该匹配字符串
[bob in ~] echo $STRING thisisaverylongname [bob in ~] echo ${STRING%name} thisisaverylong |