1.變量內容修改
file=/dir1/dir2/dir3/my.file.txt
可以用 ${ } 分別替換獲得不同的值:
${file#*/}: 拿掉第一條 / 及其左邊的字符串:dir1/dir2/dir3/my.file.txt
${file##*/}:拿掉最後一條 / 及其左邊的字符串:my.file.txt
${file#*.}: 拿掉第一個 . 及其左邊的字符串:file.txt
${file##*.}:拿掉最後一個 . 及其左邊的字符串:txt
${file%/*}: 拿掉最後條 / 及其右邊的字符串:/dir1/dir2/dir3
${file%%/*}:拿掉第一條 / 及其右邊的字符串:(空值)
${file%.*}: 拿掉最後一個 . 及其右邊的字符串:/dir1/dir2/dir3/my.file
${file%%.*}:拿掉第一個 . 及其右邊的字符串:/dir1/dir2/dir3/my
${file/.txt/.cpp} 將.txt取代爲.cpp:/dir1/dir2/dir3/my.file.cpp
2.有條件的變量替換
${variable: -value}
變量替換時將使用命令行中定義的默認值,但變量的值並沒有因此而改變。
例:$echo Hello $UNAME
結果顯示:Hello
$echo Hello ${UNAME: -there}
結果顯示:Hello there
$echo $UNAME
結果顯示: (空)
$UNAME=John
$echo Hello ${UNAME: -there}
結果顯示:Hello John
${variable:=value}
不但使用默認值進行替換,而且將默認值賦給該變量。該形式在變量替換後同時把值value符給變量variable。
例:$echo Hello $UNAME
結果顯示:Hello
$echo Hello ${UNAME:=there}
結果顯示:Hello there
$echo $UNAME
結果顯示:there
${variable: +value}
只有當變量已賦值時才用指定值替換,變量variable已賦值時,其值才用value替換,否則不進行任何替換。
例:$ERROPT=A
$echo ${ERROPT: +"Error tracking is acitive"}
結果顯示:Error tracking is acitive
$ERROPT=
$echo ${ERROPT: +"Error tracking is acitive"}
結果顯示: (空)
${variable:?message}
使用錯誤檢查的條件進行變量替換,當變量variable已設置時,正常替換。
例:$UNAME=
$echo $ {UNAME:?"UNAME HAS NOT BEEN SET"}
結果顯示:UNAME HAS NOT BEEN SET
$UNAME=Stephanie
$echo ${UNAME:?"UNAME HAS NOT BEEN SET"}
結果顯示:Stephanie
3.在操作中的使用
集體增加後綴
find . ! -type d |xargs -i mv {} {}.c;
find . ! -type d -exec mv -f {} {}.suf \;
把*.txt 變成 *.cpp
方法一
for file in `find ./ -name "*.txt" -type f`;do mv $file ${file%.*}.cpp;done
方法二
rename .txt .cpp *.txt