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