FILE_NAME="/usr/local/app/world.txt" TIME_NOW="`date +"%Y%m%d%H%M%S"`"1. 取字符串的子串, 好比說從TIME_NOW分別取出日期和時間
DATE_TODAY="${TIME_NOW:0:8}" # ${var:beg_pos:sub_str_length}, beg_pos是子串的起始位置(從0開始), sub_str_length爲子串長度 TIME_TODAY="${TIME_NOW:8:6}" # 或者 TIME_TODAY="${TIME_NOW:8}" # sub_str_length爲0表示到源字符串的結尾 # 取FILE_NAME中的文件名world.txt(不包括路徑), 不少童鞋會立刻想到basename, 或者一些相似於正則匹配的操做 ${FILE_NAME##*/} # 至關於basename ${FILE_NAME},即刪除按從左至右,匹配一直到最後一個/之間的子串 ${FILE_NAME%/*} # 至關與dirname, 即刪除按從右至左方向開始,匹配到第一個/之間的子串 ${FILE_NAME#*/} # 從左至右, 刪除第一個/及左邊的子串 ${FILE_NAME%%/*} # 從右至左, 刪除至最後一個/及右邊的子串2. 字符串替換
${FILE_NAME/world.txt/hello.txt} # 把第一個world.txt替換成hello.txt ${FILE_NAME//a/A} # 把全部的a替換成A
%x=abcdabcd %echo ${x/a/b} # 只替換一個 bbcdabcd %echo ${x//a/b} # 替換全部 bbcdbbcd3. 計算字符串長度
${#FILE_NAME} # 計算FILE_NAME的長度 ARRAY=(abc defg hijklmn) ${#ARRAY} # 計算這個數組的維數 ${#ARRAY[2]} # 計算這個數組第三個元素的長度4.basename是最經常使用的,除此以外,Bash中還有個用字符串處理的方法(適用於bash):
for i in /var/html/* do echo $i #全路徑名 echo ${i##*/} #文件名 done
#表示去除從指定字符向前全部的字符;##表示最大匹配。html
%表示去除從指定字符向後全部的字符;%%表示最大匹配。python
單個的表示最小匹配,雙個表示最大匹配。
也就是說,當匹配的有多種方案的時候,選擇匹配的最大長度仍是最小長度。數組
str="abbc,def,ghi,abcjkl" echo ${str#a*c} # 輸出,def,ghi,abcjkl 一個井號(#) 表示從左邊截取掉最短的匹配 (這裏把abbc字串去掉) echo ${str##a*c} # 輸出jkl, 兩個井號(##) 表示從左邊截取掉最長的匹配 (這裏把abbc,def,ghi,abc字串去掉) echo ${str#"a*c"} # 輸出abbc,def,ghi,abcjkl 由於str中沒有"a*c"子串 echo ${str##"a*c"} # 輸出abbc,def,ghi,abcjkl 同理 echo ${str#*a*c*} # 空 echo ${str##*a*c*} # 空 echo ${str#d*f) # 輸出abbc,def,ghi,abcjkl, echo ${str#*d*f} # 輸出,ghi,abcjkl echo ${str%a*l} # abbc,def,ghi 一個百分號(%)表示從右邊截取最短的匹配 echo ${str%%b*l} # a 兩個百分號表示(%%)表示從右邊截取最長的匹配 echo ${str%a*c} # abbc,def,ghi,abcjkl能夠這樣記憶, 井號(#)一般用於表示一個數字,它是放在前面的;百分號(%)卸載數字的後面; 或者這樣記憶,在鍵盤佈局中,井號(#)老是位於百分號(%)的左邊(即前面)
for i in /var/html/* do echo $i #全路徑名 filename=${i##*/} #帶擴展名的文件名,用basename也能夠 echo ${filename%.*} #去除擴展名的文件名 done或者用sed的正則替換命令:
for i in /var/html/* do echo $i #全路徑名 echo $i|sed -r 's#.*/(.*)\..*#\1#' #去除擴展名的文件名 done或者用awk:
for i in /var/html/* do echo $i #全路徑名 echo $i|awk -F"[/.]" '{print $(NF-1)}' #去除擴展名的文件名 done