|
下面分别举例字符串处理的应用
字符串操作符1:
上面的意思是,如果 varname 存在,就用它,反之则用 word。
举一个例子,一个文本内容为:5 Depeche Mode
2 Split Enz
3 Simple Minds
1 Vivaldi, Antonio 下面使用只有一行命令的脚本去处理这个文本,脚本代码为:#!/bin/sh
sort -nr $1 | head -${2:-10} 脚本中包含 $1,所以运行时先用只含有 1 个参数来运行,这个参数就是这个文本的名称。其运行输出为:groad@linux-z13e:~/shell> sh test.sh test.txt
5 Depeche Mode
3 Simple Minds
2 Split Enz
1 Vivaldi, Antonio 再用 2 个参数来运行这个脚本:groad@linux-z13e:~/shell>sh test.sh test.txt 5
5 Depeche Mode
3 Simple Minds
2 Split Enz
1 Vivaldi, Antonio 比较两次的运行结果,发现第 1 次运行包括空行在内总共有 10 行,第 2 次运行包括空行在内总共有 5 行。之所以产生这样的不同,是因为有 -${2:-10} 。下面从左到右分析脚本:
sort 命令的 n 参数表示“每行字符串按照数值进行排序“,参数 r 表示“按照反序排序”,所以排列的结果的第一列中的排序是 5,3,2,1。
head 命令在默认情况下显示文本的前 10 行内容,但可以通过 "-" 符号来指定要显示的行数。在 "${2:-10}" 中,“2” 表示的是位置参数,即 $2 。整个的意思就是,如果 $2 不存在,就用后面的数字 10,然后变成 head -10;如果在命令行中指定了第 2 个位置参数,那么这个命令就被解释成 head $2
在上面的脚本中,可读性似乎还比较差,可以修改如下:
#!/bin/sh
filename=$1
howmany=${2:-10}
sort -nr $filename| head -$howmany 这样看来,可读性似乎变好了,但是还不够完美。因为假如在运行不给脚本添加一个参数,那么脚本将由于 sort 命令而阻塞,这样对与用户来说,也是一种不友好的表现,因为他得不到应有的提示。可以修改如下:
#!/bin/sh
filename=${1:?"filename missing."}
howmany=${2:-10}
sort -nr $filename| head -$howmany 这里,使用了字符串处理的另一种形式: ${varname:?message}
这种形式的意思是,如果 varname 存在且不为空,则返回其值。否则,打印出 varname 不存在的 message。这里根据不同的系统,这个提示会有所不同,但是 varname: 是一定会有,如我的系统提示是:test.sh: line 3: 1: filename missing. 但有些系统可能不会提示 line 3: 1: 这些内容,而直接提示 test.sh: filename missing 。
与 ${varname:-word} 类似的还有一个用法形如 ${varname:=word} -- 它的意思是:
如果 varname 存在且不为空,则返回 varname。否则设置 varname 为 word 。
如果我们将脚本改为:
#!/bin/sh
filename=${1:?"filename missing."}
howmany=$2
sort -nr $filename| head -${howmany:=2} 这样,当我们在命令行中不给出第 2 个参数时,则第 2 个参数被设置为 2 。还是处理上面的文本文件,输出如下:groad@linux-z13e:~/shell> sh test.sh test.txt
5 Depeche Mode
3 Simple Minds 从这里我们可以看出,使用 “:=” 的好处时,可以将被 word 设置的变量留为后用,而 ":-" 则是一次性返回 word 。
最后,再看另一种形式: ${varname:+word}
这种形式要表达的作用是,如果 varname 存在且不为空,则返回 word,否则返回空。修改代码如下:
#!/bin/sh
header=""
filename=${1:?"filename missing."}
howmany=$2
if [ “$3” == "-header" ];then
header=$3
fi
echo-e -n ${header:+"ALBUMS ARTIST\n"}
sort -nr $filename| head -${howmany:=2} 在这段脚本中,echo 这条语句的意思是,如果 header 这个变量有值,则打印 ALBUMS ARTIST 这一串字,并回车换行(参数 -e 使能转义字符)。这里,如果没有 if 语句对 header 赋值的话,那么 ${header:+"ALBUMS ARTIST\N"} 就会返回空,从而也不会输出 ALBUMS ARTIST 这一串字。同样,如果 $3 不给出或者给出的不是 -header ,那也不会输出 ALBUMS ARTIST 。比较下面两种情况的输出:
给出的 $3 不符合定义时的输出:groad@linux-z13e:~/shell> sh test.sh test.txt 3 -heade
5 Depeche Mode
3 Simple Minds
2 Split Enz 给出的 $3 符合定义时的输出:groad@linux-z13e:~/shell> sh test.sh test.txt 3 -header
ALBUMS ARTIST
5 Depeche Mode
3 Simple Minds
2 Split Enz |
|