曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 4632|回复: 0
打印 上一主题 下一主题

${varname:-word}|${varname:=word}${varname:?message}|${varname:+word}

[复制链接]

4917

主题

5879

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34382
跳转到指定楼层
楼主
发表于 2010-7-6 22:34:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面分别举例字符串处理的应用

字符串操作符1:
${varname:-word}
上面的意思是,如果 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
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2024-5-15 18:12 , Processed in 0.074665 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表