闲情逸致 http://EZ38.com
分类: LINUX
2010-03-05 16:04:34
啊,昨天上网看到一篇讲 linux/unix shell 的文章,想想自己最后写这东西也是一年前的事了,想想都快忘光了。 还是整理一下,做一次回顾,以后说不定还用得上;帖出来,方便第一次学习这东西的同道中人。 如果发现有错误的地方,请指出,留一句即可,我会感激的。废话少说了!!! linux 下最重要的脚本语言算是 bash 了,我也就写点这个吧(我也只会这个:))。跟其他开发语言(如C)比,bash 是比较简单的一种语言,主要用于写一些脚本代码,一些批处理或安装程序。你可以看看在/etc/init.d/目录下,那里就有很多用来控制各个服务的脚本文件。 先看一个“hello world!”的例子: #!/bin/sh 好,就这些。保存,在命令提示符下进入保存“hello.sh”的目录,这样执行: 我们先看看bash脚本中变量的使用。 #!/bin/bash 保存后按照上面的方法执行该脚本,你将看到和以前一样的效果。我们看看每一句的意义: 对于第三行,可能有人会问:在C/C++中,变量都属于某个类型,在这变量 str 的类型是什么呢?在 BASH 中变量定义是不需要的,没有 "int i" 这样的定义过程。如果想用一个变量,只要他没有在前面被定义过,就直接可以用,当然你使用该变量的第一条语句应该是对他赋初值了,如果你不赋初值也没关系,只不过该变量是空( 注意:是 NULL,不是 0 )。 关于变量的使用,要注意以下几点: 在比较详细的 bash 文档中,会规定使用变量要采用这样的形式:${STR},如果你的脚本出了莫名其妙的错误,不妨看看是不是这个问题造成的。 BASH 中的变量既然不需要定义,也就没有类型一说,那是不是一个变量既可以存放整数,也可以存放字符串呢?对! #!/bin/bash 执行一下看看? 又出现了新的关键字:let。关于整数变量计算,有如下几种:" + - * / % ",他们的意思和字面意思相同,在*和/之前必须冠以反斜线,已防被SHELL先行解释。整数运算一般通过 let 和 expr 这两个指令来实现,如对变量 x 加 1 可以写作:let "x = $x + 1" 或者 x=`expr $x + 1`
$# 传入脚本的命令行参数个数; $* 所有命令行参数值,在各个参数值之间留有空格; 位置变元 $0 命令本身(shell文件名) $1 第一个命令行参数; $2 第二个命令行参数; ... 好,编辑以下脚本: echo "number of vars:"$# echo "values of vars:"$* echo "value of var1:"$1 保存文件名为 my.sh,执行时传入参数:#sh my.sh a b c d e(回车),看到结果你就会更清楚各个变量的意思。如果访问的参数在执行时没有传入,如有一条这样的代码: 而在执行时并没有输入100个参数,那取得的值为 NULL。 在 BASH 程序中如果一个变量被使用了,那么直到该程序的结尾,该变量都一直有效。为了使得某个变量存在于一个局部程序块中,就引入了局部变量的概念。BASH 中,在变量首次被赋初值时加上 local 关键字就可以声明一个局部变量,如下面这个例子: #!/bin/bash echo $HELLO 该程序的执行结果是: var1 这个执行结果表明全局变量 $HELLO 的值在执行函数 hello 时并没有被改变。也就是说局部变量 $HELLO 的影响只存在于函数那个程序块中。 BASH 中的变量与 C 语言中变量的区别 1,BASH 中的变量在引用时都需要在变量前加上 "$" 符号( 第一次赋值及在For循环的头部不用加 "$"符号 ); 下面我们来看看变量之间的比较操作: 对应的操作 整数操作 字符串操作
注意:在“[”和“]”符号的左右都留有空格。 BASH 是 Linux 操作系统的 Shell,因此系统的文件必然是 BASH 需要操作的重要对象 含义( 满足下面要求时返回 TRUE ) -e 文件已经存在 如 if [ -x /root ] 可以用于判断 /root 目录是否可以被当前用户进入。
if [ expression ] 或者 if [ expression ] 或者 if [ expression ] 或者 if [ expression ] 如果您为了简洁,想把 then 和 if 放在一行,那就要这样写了:if [ expression ]; then。即在 then 前加一个“;”号(bash 里面每行的结束处没有分号,那要把两行的内容写到一行,是不是要用“;”号隔开啊?哈哈,对!这样说来,“if [ expression ]; then”只是把两行内容写到了一行,没有什么新的东西。)。 for 循环结构与 C 语言中有所不同,在 BASH 中 for 循环的基本结构是: for $var in [list] 其中 $var 是循环控制变量,[list] 是 var 需要遍历的一个集合,do/done 对包含了循环体,相当于 C 语言中的一对大括号。另外如果do 和 for 被写在同一行,必须在 do 前面加上 ";"。如: for $var in [list]; do 。下面是一个运用 for 进行循环的例子: #!/bin/bash for day in Sun Mon Tue Wed Thu Fri Sat # 如果列表被包含在一对双引号中,则被认为是一个元素 exit 0 注意上面的例子中,在 for 所在那行的变量 day 是没有加 "$" 符号的,而在循环体内,echo 所在行变量 $day 是必须加上 "$" 符号的。另外如果写成 for day 而没有后面的 in [list] 部分,则 day 将取遍命令行的所有参数。如这个程序: #!/bin/bash for param exit 0 上面这个程序将列出所有命令行参数。for 循环结构的循环体被包含在 do/done 对中,这也是后面的 while、until 循环所具有的特点。 while 循环的基本结构是: while [ condition ] 这个结构请大家自己编写一个例子来验证。 until 循环的基本结构是: until [ condition is TRUE ] 这个结构也请大家自己编写一个例子来验证。 case case "$var" in 下面这个程序是运用 case 结构进行分支执行的例子: #!/bin/bash echo "Hit a key, then hit return." case "$Keypress" in exit 0 上面例子中的第四行 "read Keypress" 一句中的 read 语句表示从键盘上读取输入。这个命令将在本讲义的 BASH 的其他高级问题中讲解。 break/continue
ctrl+u 删除光标以前的所有字符 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/compiler_hdz/archive/2006/01/10/575113.aspx |