一个简单的getopt命令的模拟, 使用子串提取结构.
例子 9-13. 模拟getopt
1 #!/bin/bash
2 # getopt-simple.sh
3 # 作者: Chris Morgan
4 # 已经经过授权, 可以使用在本书中.
5
6
7 getopt_simple()
8 {
9 echo "getopt_simple()"
10 echo "Parameters are '$*'"
11 until [ -z "$1" ]
12 do
13 echo "Processing parameter of: '$1'"
14 if [ ${1:0:1} = '/' ]
15 then
16 tmp=${1:1} # 去掉开头的'/' . . .
17 parameter=${tmp%%=*} # 提取参数名.
18 value=${tmp##*=} # 提取参数值.
19 echo "Parameter: '$parameter', value: '$value'"
20 eval $parameter=$value
21 fi
22 shift
23 done
24 }
25
26 # 把所有选项传给函数getopt_simple().
27 getopt_simple $*
28
29 echo "test is '$test'"
30 echo "test2 is '$test2'"
31
32 exit 0
33
34 ---
35
36 sh getopt_example.sh /test=value1 /test2=value2
37
38 Parameters are '/test=value1 /test2=value2'
39 Processing parameter of: '/test=value1'
40 Parameter: 'test', value: 'value1'
41 Processing parameter of: '/test2=value2'
42 Parameter: 'test2', value: 'value2'
43 test is 'value1'
44 test2 is 'value2'
--------------------------------------------------------------------------------
子串替换
${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'来替换所有匹配的'abc'.
${string/#substring/replacement}
如果$substring匹配$string的开头部分, 那么就用$replacement来替换$substring.
${string/%substring/replacement}
如果$substring匹配$string的结尾部分, 那么就用$replacement来替换$substring.
1 stringZ=abcABC123ABCabc
2
3 echo ${stringZ/#abc/XYZ} # XYZABC123ABCabc
4 # 用'XYZ'替换开头的'abc'.
5
6 echo ${stringZ/%abc/XYZ} # abcABC123ABCXYZ
7 # 用'XYZ'替换结尾的'abc'.
9.2.1. 使用awk来处理字符串
Bash脚本也可以调用awk的字符串操作功能来代替它自己内建的字符串操作.
--------------------------------------------------------------------------------
例子 9-14. 提取字符串的另一种方法
1 #!/bin/bash
2 # substring-extraction.sh
3
4 String=23skidoo1
5 # 012345678 Bash
6 # 123456789 awk
7 # 注意不同的字符串索引系统:
8 # Bash的第一个字符是从'0'开始记录的.
9 # Awk的第一个字符是从'1'开始记录的.
10
11 echo ${String:2:4} # 位置 3 (0-1-2), 4 个字符长
12 # skid
13
14 # awk中等价于${string:pos:length}的命令是substr(string,pos,length).
15 echo | awk '
16 { print substr("'"${String}"'",3,4) # skid
17 }
18 '
19 # 使用一个空的"echo"通过管道传递给awk一个假的输入,
20 #+ 这样就不必提供一个文件名给awk.
21
22 exit 0