高級變數,有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 ${[email protected]}
結果為: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
本文出自 「我的地盤聽我的」 博客,請務必保留此出處http://2614223.blog.51cto.com/2604223/577720
[火星人 ] Linux shell編程(二)高級變數已經有990次圍觀