高级变量,有3个主题:

(1)变量扩展         ${变量名称}    $(filename)

(2)命令替换         ${命令}            $(ls /)

(3)算术扩展         $((算术式))       $((9+9))

1. 测试变量“存在于否”的基本用法

语法:${待测变量-默认值}

用例:

          unset myname

          r=${myname-'basher'}

          echo $r

结果为:basher

2. 测试变量“不存在”或其值为空:“传回”一个默认值

语法:${待测变量:-默认值}

用例:

         myname=

         r=${myname:-'basher'}

         echo $r

结果为:basher

 特殊运用法

[ -n ${DEBUG:-} ] && set -v

[  ]是测试条件的语法,其中-n是用来测试后接的变量是否有值,若非空,则传回真值。

${DEBUG:-}就是-n要测试的对象。:-后面原本放置默认值的地方却没有任何东西,表示故意要让默认值为空。

3.测试变量“不存在”或其值为空:给变量设一个默认值

语法:${待测变量:=默认值}

用例:

          unset count

          r=${count:=100}

          echo $count

结果为:100

用例2:

            count=500

             r=${count:=100}

             echo $r

结果为:500

目的:给变量设一个默认值

4.测试变量是否“不存在”或其值为空:提示错误信息

语法:${待测变量:?提示信息}

5.测试变量的“存在性”

语法:${待测变量:+真值}

用例:

           Iamhappy='feel so good'

           r=${Iamhappy:+'true'}

           echo $r

结果为:true

目的:用来测试某件事是真的。

6.变量的扩展:取字符串切片,字符串长度

(1)取字符串切片

语法一:${变量:位置起点}

用例:

          myname="sheller name"

          substr=${myname:4}

结果为:ler name

语法二:${变量:位置起点:长度}

用例:

         filename="/etc/apache2"

          dir1=${filename:1:3}

          echo $dir1

结果为etc

7.计算字符串长度

语法:${#变量名称}

用例:

         filename="/usr/sbin/ntpdate"

          echo ${#filename}

  结果为:17

8.变量扩展:对比样式

由字符串前面对比,删除相符者

语法:${变量#样式}

用例1:

           filename="/usr/sbin/ntpdate"

           r=${filename#/*/}

           echo $r

结果为:sbin/ntpdate

用例2:

           filename="//usr/sbin/ntpdate"

           r=${filename#/*/}

           echo $r

结果为:usr/sbin/ntpdate

由前面对比,删最长的

语法:${变量##样式}

用例:

          filename="/usr/sbin/ntpdate"

          r=${filename##/*/}

          echo $r

结果为:ntpdate

由后面对比,删最短的

语法:${变量%样式}

用例:

           filename="/usr/sbin/ntpdate"

            r=${filename%/*}

            echo $r

结果为 /usr/sbin

由后面对比,删最长的

语法:${变量%%样式}

用例:

           fqdn="www.tnc.edu.cn"

            m=${fqdn%%.*}

            echo $m

结果为www

总结:#经常放在数字前面表示个数,就记住它是由前面对比。一个#删最短,两个#删最长。

%经常放在数字后面代表百分比,所以看到它,就记着它是由后面对比。一个%删最短,两个%%删最长。

9. 只替换第一个对比符合的字符串

语法:${变量/样式/替换字符串}

用例:把:换成,

     act="mail:x:8:8:mail:/var/mail"

     r=${act/:/,}

      echo $r

结果为:mail,x:8:8:mail:/var/mail

10. 替换全部对比符合的字符串

语法:${变量//样式/替换字符串}

  把;换成,

   act="mail:x:8:8:mail:/var/mail"

   r=${act//:/,}

   echo r$

  结果为:mail,x,8,8,mai,/var/mail

11. 把对比符合的字符串删除

只删一个

语法:${变量/样式/}

用例:把第一个:删除

act="mail:x:x:8:8:mail:/var/mail"

r=${act/:/}

echo r$

结果为:mailx:x:8:8:mail:/var/mail

删除全部

语法:${变量//样式/}

把所有的:删除

用例:

         act="mail:x:8:8:mail:/var/mail"

         r=${act//:/}

         echo r$

结果为:mailx88mail/var/mail

12.变量扩展:取变量名称列表、数组索引列表

取变量名称列表

语法:${!开头字符串@}或${!开头字符串*}

用例:

         filename="ntpdate"

         dir="/usr/sbin"

          dir_file="$dir/$filename"

          echo ${!di@}

结果为:dir dir_file

取数组索引列表

语法:${!数组变量[@]}或{!数组变量[*]}

用例:

         ar=(a b c xy z)

         r=${!ar[@]}

         echo r$

结果为:0 1 2 3 4

用例:

         ar=(a b c xy z)

         for i in "${!ar[@]}"

          do

           echo "index $i: ${ar[$i]}"

执行结果为:index 0: a

                       index 1: b

                      ................

13.命令替换

命令替换的语法是变量名称=$(命令)

用例:

        DIRS=$(ls)

        for f in $DIRS

        do

            echo $f

          done

$DIRS里的文件名,轮替放入$f,然后由行4显示出来

14.算术扩展

算术扩展的语法:$((算术式))

用例:

         I=$((8+16))

         echo $I

结果显示为:24