$ MYFOO="chickensoup.tar.gz"
$ echo ${MYFOO%%.*}
chickensoup
$ echo ${MYFOO%.*}
chickensoup.tar
正如你所见,除了将匹配通配符从字符串末尾去除之外,%和%%变量扩展的选项和#和##没有什么不同。注意:如果你希望从末尾移除一个特殊的子串,则不能运用"*"字符:
代码 1.20: 从末尾移去字符
MYFOOD="chickensoup"
$ echo ${MYFOOD%%soup}
chicken
在这个例子中,既然只有一个匹配,我们使用"%%"或"%"也就不重要了。同时记住,如果你忘记了是使用"#"还是"%",请看键盘上的3,4,5键并猜出来。 我们可以运用其它形式的变量扩展来选择一个特殊的子串,它是基于一个特定的字符串偏移和长度。请尝试在bash下敲入下面几行: 代码 1.21: 选择一个特殊的子字符串
$ EXCLAIM=cowabunga
$ echo ${EXCLAIM:0:3}
cow
$ echo ${EXCLAIM:3:7}
(Gentoo)Bash示例,第一部分
abunga
这种形式的字符串拆分将十分简便;只需简单的用冒号分开指定字符的起始字符和子串的长度。
应用字符串拆分
现在我们已经学了拆分字符串的所有内容,让我们写一个简单的小shell脚本。我们的脚本将接受单个文件作为参数并打印出它是否是一个压缩档,它将在文件的结尾寻找模式".tar"。下面就是: 代码 1.22: mytar.sh──一个示例脚本
#!/bin/bash
if [ "${1##*.}" = "tar" ]
then
echo This appears to be a tarball.
else
echo At first glance, this does not appear to be a tarball. fi 要运行这个脚本,将它输入到几个叫mytar.sh,并敲入chmod 755 mytar.sh使它可执行。然后如下给他一个压缩档做试验:
代码 1.23: 尝试这个脚本
$ ./mytar.sh thisfile.tar
This appears to be a tarball.
$ ./mytar.sh thatfile.gz
At first glance, this does not appear to be a tarball.
好,它工作了,但是它不是很实用。在我们将它变得实用之前,先让我们看看上面用的"if"语句。其中,我们有一个布尔表达式。在bash中,"="比较操 作检查字符串是否相等。但是这布尔表达式真正测试的是什么呢?让我们看看左边。通过我们所学习的字符串拆分,"${1##*.}"将从包含环境变量"1" 的字符串起始处移除"*."的最长匹配,并返回结果。这将返回文件中最后一个"."之后的所有部分。很明显,如果一个文件以".tar"结尾,我们将获 取"tar"作为结果,条件也就为真。
你可能会吃惊环境变量"1"是在第一个位置。非常简单──$1是这个脚本的第一个命令行参数,$2是第二个,如此等等。好的,现在我们已经回顾乐这个函数,我们可以看一下"if"语句了。
If语句
(Gentoo)Bash示例,第一部分
像大多语言一样,bash有它自己的条件类型。当使用它们时,请准照上面的格式;它是使"if"和"then"在不同的行,"else"和结束处必须的"fi"和它们水平对齐。这使代码易于阅读和调试。除了"if,else"形式,"if"语句还有很多其它形式: 代码 1.24: if语句的基本结构
if [ condition ]
then
action
fi
只有当condition为真的,它才会执行一个动作,否则它不执行任何动作并继续执行直到"fi"的行。 代码 1.25: 在继续fi之后的命令之前检查状况
if [ condition ]
then
action
elif [ condition2 ]
then
action2
.
.
.
elif [ condition3 ]
then
else
actionx
fi
上面的"elif"序列将连续测试每一个condition并执行第一个真的condition所相应的动作。如果没有condition是真,它将执行"else"动作,如果有一个为真,它将继续执行所有接下来的"if,elif,else"语句。
下一次
现在我们已经涵盖了大部分的基本的bash功能,是时候加快脚步准备书写一些真正的脚本了。在下一部分中,我将讲述循环结构,函数,命名空间和其它重要的 话题。接下来我们将准备写更多的复杂的脚本。在第三篇文章中,我们将重点集中在非常复杂的脚本和函数上,正如很多bash脚本设计选项一样。到时候再见!
2. 资源
(Gentoo)Bash示例,第一部分
有用的链接
请阅读 请阅读 访问