Bash 變量是不分類型的 ------------------------ 不像其他程序語言一樣,Bash 並不對變量區分"類型".本質上,Bash 變量都是字符串. 但是依賴於上下文,Bash 也允許比較操作和算術操作.決定這些的關鍵因素就是,變量中的值 是否只有數字. 賦值 a=123 a="sdsd" #注意=左右不要有空格,否則就變成比較字符串操作 引用 $a #借助$符 操作字符串 字符穿連接 a="sdfs" b="dsds" c=$a$b -------------- Bash 支持超多的字符串操作,操作的種類和數量令人驚異.但不幸的是,這些工具缺乏集中性. 一些是參數替換的子集,但是另一些則屬於UNIX 的expr 命令.這就導致了命令語法的不一致和 功能的重疊,當然也會引起混亂. 字符串長度 ${#string} expr length $string expr "$string" : '.*' 1 stringZ=abcABC123ABCabc 2 3 echo ${#stringZ} # 15 4 echo `expr length $stringZ` # 15 5 echo `expr "$stringZ" : '.*'` # 15 從字符串開始的位置匹配子串的長度 expr match "$string" '$substring' $substring 是一個正則表達式 expr "$string" : '$substring' $substring 是一個正則表達式 1 stringZ=abcABC123ABCabc 2 # |------| 3 4 echo `expr match "$stringZ" 'abc[A-Z]*.2'` # 8 5 echo `expr "$stringZ" : 'abc[A-Z]*.2'` # 8 expr index $string $substring 匹配到子串的第一個字符的位置. 1 stringZ=abcABC123ABCabc 2 echo `expr index "$stringZ" C12` # 6 3 # C position. 4 5 echo `expr index "$stringZ" 1c` # 3 6 # 'c' (in #3 position) matches before '1'. 在 C 語言中最近的等價函數為strchr(). 提取子串 ${string:position} 在 string 中從位置$position 開始提取子串. 如果$string 為"*"或"@",那么將提取從位置$position 開始的位置參數,[1] ${string:position:length} 在 string 中從位置$position 開始提取$length 長度的子串. ################################Start Script####################################### 1 stringZ=abcABC123ABCabc 2 # 0123456789..... 3 # 0-based indexing. 4 5 echo ${stringZ:0} # abcABC123ABCabc 6 echo ${stringZ:1} # bcABC123ABCabc 7 echo ${stringZ:7} # 23ABCabc 8 9 echo ${stringZ:7:3} # 23A 10 # 3 個字符長度的子串. 子串削除 ${string#substring} 從$string 的左邊截掉第一個匹配的$substring ${string##substring} 從$string 的左邊截掉最后一個個匹配的$substring 1 stringZ=abcABC123ABCabc 2 # |----| 3 # |----------| 4 5 echo ${stringZ#a*C} # 123ABCabc 6 # 截掉'a'和'C'之間最近的匹配. 7 8 echo ${stringZ##a*C} # abc 9 # 截掉'a'和'C'之間最遠的匹配. ${string%substring} 從$string 的右邊截掉第一個匹配的$substring ${string%%substring} 從$string 的右邊截掉最后一個匹配的$substring 1 stringZ=abcABC123ABCabc 2 # || 3 # |------------| 4 5 echo ${stringZ%b*c} # abcABC123ABCa 6 # 從$stringZ 的后邊開始截掉'b'和'c'之間的最近的匹配 7 8 echo ${stringZ%%b*c} # a 9 # 從$stringZ 的后邊開始截掉'b'和'c'之間的最遠的匹配 子串替換 ${string/substring/replacement} 使用$replacement 來替換第一個匹配的$substring. ${string//substring/replacement} 使用$replacement 來替換所有匹配的$substring. 1 stringZ=abcABC123ABCabc 2 3 echo ${stringZ/abc/xyz} # xyzABC123ABCabc 4 # 用'xyz'來替換第一個匹配的'abc'. 5 6 echo ${stringZ//abc/xyz} # xyzABC123ABCxyz 7 # 用'xyz'來替換所有匹配的
個人覺得條件判斷框的格式要求很嚴格,'[' 前后都必須有一個空格 if 結構 if [ condition1 ] then if [ condition2 ] then do-something # 這里只有在condition1 和condition2 都可用的時候才行. fi elif [ condition3 ] then do ... else do .... fi case 結構 注意要以 ;;結束 case "$variable" in abc) echo "\$variable = abc" ;; xyz) echo "\$variable = xyz" ;; *) echo "dfsdf" ;; #*表示default,若上面匹配都不成功則會執行 esac for 結構 這是一個基本的循環結構.它與C 的相似結構有很大不同. # 標准語法. for a in 1 2 3 4 5 6 7 8 9 10 do echo -n "$a " done LIMIT=10 for ((a=1; a <= LIMIT ; a++)) # Double parentheses, and "LIMIT" with no "$". for ((a=1; a <= LIMIT ; a++)) # 雙圓括號, 並且"LIMIT"變量前邊沒有 "$". do echo -n "$a " done while [condition] do command... done 和 for 循環一樣,如果想把do 和條件放到同一行上還是需要一個";". while [condition]; do C風格語法 while (( a <= LIMIT )) # 雙圓括號, 變量前邊沒有"$". do echo -n "$a " ((a += 1)) # let "a+=1" # Yes, 看到了吧. # 雙圓括號允許像C 風格的語法一樣增加變量的值. done until 這個結構在循環的頂部判斷條件,並且如果條件一直為false 那就一直循環下去.(與while 相反) until [condition-is-true] do command... done 注意: until 循環的判斷在循環的頂部,這與某些編程語言是不同的. 與 for 循環一樣,如果想把do 和條件放在一行里,就使用";". until [condition-is-true]; do