Bash编程实例 一
时间:2005-12-08 来源:sdemon915
Bash 编程实例
第一部分
环境变量
在 bash 中定义环境变量的标准方法是:
$ myvar='This is my environment variable!'
以上命令定义了一个名为 "myvar" 的环境变量,并包含字符串 "This is my environment variable!"。以上有几点注意事项:第一,在等号 "=" 的两边没有空格,任何空格将导致错误。第二个件要注意的事是:虽然在定义一个字时可以省略引号,但是当定义的环境变量值多于一个字时(包含空格或制表键),引号是必须的。第三,虽然通常可以用双引号来替代单引号,但在上例中,这样做会导致错误。因为使用单引号禁用了称为扩展的 bash 特性,其中,特殊字符和字符系列由值替换。例如,"!" 字符是历史扩展字符,bash 通常将其替换为前面输入的命令。尽管这个类似于宏的功能很便利,但我们现在只想在环境变量后面加上一个简单的感叹号,而不是宏。
另一个例子
$ echo foo$myvarbar
bash会困惑,到底扩展$m、$my、$myvar、$myvarbar...在这种情况下要用显式的花括号将它括起。
$ echo foo${myvar}bar
一定要记住:当环境变量没有用空白(空格或制表键)与周围文本分开时,要使用更明确的花括号形式。
当一个环境变量被导出时,它可以自动地由以后运行的任何脚本或可执行程序环境使用。shell脚本可以使用shell的内置环境变量支持“到达”环境变量,而C程序可以使用getenv()函数调用。如下C代码示例:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
char *myenvvar=getenv("myvar");
printf("The myvar environment variable is %s ",myenvvar);
}
直接执行程序,结果为:
The myvar environment variable is (null)
在export myvar后,程序执行结果为:
The myvar environment variable is This is my environment variable!
使用unset除去环境变量后,程序执行结果为:
The myvar environment variable is (null)
另外,也可以在一行定义并到处环境变量,如:
export myvar=abc
截断字符串概述
截断字符串是将初始字符串截断成较小的独立块,它是一般 shell 脚本每天执行的任务之一。
$ basename /usr/local/share/doc/foo/foo.txt
foo.txt
Basename是一个截断字符串的极简便工具。它的相关命令dirname返回basename丢弃的“另”一个部分路径。
$ dirname /usr/local/share/doc/foo/foo.txt
/usr/local/share/doc/foo
命令替换
如何创建一个包含可执行命令结果的环境变量,可以通过如下方法:
$ MYDIR=`dirname /usr/local/share/doc/foo/foo.txt`
$ echo $MYDIR
/usr/local/share/doc/foo
以上程序需要注意的是:在第一行,将要执行的命令以 反引号 括起。不是标准的单引号,而是键盘中通常位于Tab键之上的单引号。(注:单引号中的内容将会被强制显示,也就是说单引号中的命令不会被替换)
除了反引号``外,还可以使用$()来完成同样操作
$ MYDIR=$(dirname /usr/local/share/doc/foo/foo.txt)
$ echo $MYDIR
/usr/local/share/doc/foo
使用命令替换可以将任何命令或命令管道放在``或$()之间,并将其分配给环境变量。
象专业人员那样截断字符串
有时候我们需要执行更高级的字符串“截断”,如下例子:
$ MYVAR=foodforthought.jpg
$ echo ${MYVAR##*fo}
rthought.jpg
$ echo ${MYVAR#*fo}
odforthought.jpg
第一个echo,bash取得MYVAR,找到从字符串"foodforthought.jpg" 开始处开始、且匹配通配符 "*fo" 的 最长 子字符串,然后将其从字符串的开始处截去。
第二个echo,bash取得MYVAR,找到从字符串"foodforthought.jpg" 开始处开始、且匹配通配符 "*fo" 的 最短 子字符串,然后将其从字符串的开始处截去。
记忆方法:当搜索最长匹配时,使用 ##(因为 ## 比 # 长)。当搜索最短匹配时,使用 #。如何记住使用"#"字符来从字符串开始部分出去?在美国键盘上,shift-4 是 "$",它是 bash 变量扩展字符。在键盘上,紧靠 "$" 左边的是 "#"。这样,可以看到:"#" 位于 "$" 的“开始处”,因此(根据我们的记忆法),"#" 从字符串的开始处除去字符。同理,使用"%"来从尾部截去字符串:
$ MYFOO="chickensoup.tar.gz"
$ echo ${MYFOO%%.*}
chickensoup
$ echo ${MYFOO%.*}
chickensoup.tar
如果忘记了应该使用"#" 还是 "%",则看一下键盘上的 3、4 和 5 键,然后猜出来。
还有另一种形式的变量扩展,来选择特定子字符串。
$ EXCLAIM=cowabunga
$ echo ${EXCLAIM:0:3}
cow
$ echo ${EXCLAIM:3:7}
abunga
请注意命令替换$()和截断字符串${}的区别
应用字符串截断
下面是一个简单的shell脚本,这个脚本接受一个文件作为自变量,然后打印:该文件是否是一个tar文件。
#!/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
看一下上例使用的"if"语句。语句中使用了一个布尔表达式。在bash中,"="比较运算符检查字符串是否相等。在bash中,所有布尔表达式都用方括号括起。
($1是传给脚本的第一个命令行自变量,$2是第二个,以此类推。)
If语句
if [ condition ]
then
action
fi
只有当condition为真时,该语句才执行操作,否则不执行操作,并继续执行"fi"之后的语句。
if [ condition ]
then
action
elif [ condition2 ]
then
action2
.
.
.
elif [ condition3 ]
then
else
actionx
fi
以上"elif"形式将连续测试每个条件,并执行符合第一个 真 条件的操作。如果没有条件为真,则将执行"else"操作,如果有一个条件为真,则继续执行整个"if,elif,else"语句之后的行。
原文出处:http://www-128.ibm.com/developerworks/cn/linux/shell/bash/bash-1/index.html#N1006A