发信人: skybird(晓湖) 
整理人: blainelinar(2001-08-22 08:46:42), 站内信件
 | 
 
 
BASH脚本编程速成(晓湖原创)
 
 晓湖([email protected])
 
       这是一个让我们快速了解BASH下脚本编程的冬冬。本冬冬不是教人如何编程的,而是帮助那些有过编程经验的人来熟悉BASH下的脚本编程。为了避免和脚本中的注释符混淆,本冬冬中命令行前缀用~ 符号来表示,而不是BASH中的#号。如果有什么错误的话,请各位哥哥姐姐发邮件到[email protected]给我指正。
 
 基础
 ——
     所有的脚本都必须告诉Linux用什么来作这个脚本的解释器。所以BASH脚本的第一行应该是:
 
 #!/bin/bash
 
 如果要把这个脚本变为可执行的话,需要在命令行打入:
 
 ~ chmod +x filename
 
 变量(Variables)
 ————————
 1. 建立一个变量并赋值:
 
 varname=value
 
     一个变量是没有数据类型的,可以是字符串、数字等等,所以不需要一开始来定义。
 
 2. 要使用一个变量,我们就要在变量名前面加上$:
 
 echo $varname
 
 3. 如果想在脚本中使用命令行上的参数,我们使用$#,这里的“#”表示命令行上的参数的序号。比如有个命令:
 
 ~ command var1 var2 ... varX
 
 那么在脚本中调用上面命令行中的参数就应该是:
 
 echo var1 is $1, var2 is $2 ...
 
 BASH中的内置变量(Built-In Variables)
 ———————————————————
 $1 - $n
     保存了命令行上依次从1到n的参数
 
 $?
     保存了上个命令结束后的结束值
 
 $0
     保存了命令行上的第一个单词(这个脚本程序的名字)
 
 $*
     保存了命令行上从1到n所有的参数($1 $2 ... $n)
 
 "$@"
     保存了命令行上从1到n所有的参数,而且放在了双引号中间("$1" "$2" ... "$n")
 
 引用标志(Quote Marks)
 ———————————
 双引号("like this")
     可以让解释程序忽略里面的空格,把里面所有的字符都当作一个值,但是不会忽略某些特殊的字符。
 
 单引号('like this')
     可以让解释程序忽略里面所有的特殊字符,包括空格,把里面所有的字符都当作一个值。
 
 反单引号(`command`)
     和前面两个引号不一样,这个可以用来表示另外一个命令运行后的结果,比如:
 
 contents = `ls`
 
 然后contents就可以表示列出后文件目录列表。
 
 逻辑和比较
 —————
     一个叫做test的命令可以用来判断一个条件是否为true,就好像if-then语句是用来判断一个循环是否结束一样:
 
 test expression
 或者
 [expression]
 
 数学比较式
 —————
 int1 -eq int2
     返回True,如果int1等于int2
 
 int1 -ge int2
     返回True,如果int1大于或等于int2
 
 int1 -gt int2
     返回True,如果int1大于int2
 
 int1 -le int2
     返回True,如果int1小于或等于int2
 
 int1 -lt int2
     返回True,如果int1小于int2
 
 int1 -ne int2
     返回True,如果int1不等于int2
 
 字符比较式
 —————
 str1 = str2
     返回True,如果str1和str2相等
 
 str1 != str2
     返回True,如果str1和str2不相等
 
 str
     返回True,如果str不为空
 
 -n str
     返回True,如果str的长度大于零
 
 -z str
     返回True,如果str的长度等于零(注意:字符串长度为零和字符串为空不一样)
 
 文件比较式
 —————
 -d filename
     返回True,如果filename是个目录
 
 -f filename
     返回True,如果filename是个标准的文件
 
 -r filename
     返回True,如果filename可以被进程读取
 
 -s filename
     返回True,如果filename是一个长度不为零的文件
 
 -w filename
     返回True,如果filename可以被进程写入
 
 -x filename
     返回True,如果filename是可执行的
 
 表达式比较式
 ——————
 !expression
     返回True,如果expression不为true
 
 expr1 -a expr2
     返回True,如果expr1和expr2都为true(&&, and)
 
 expr1 -o expr2
     返回True,如果expr1或expr2为true(||, or)
 
 逻辑语句
 ————
 小提示:
     每个语句的结束字都是这个语句的开始字的反向拼写,例如if的结束字就是fi,case的结束字就是esac。
 
 1. If...then 
 
 if [ expression ]
    then
        commands
 fi
 
 
 2. If..then...else 
 
 if [ expression ]
    then
        commands
    else
        commands
 fi
 
 
 3. If..then...else If...else 
 
 
 if [ expression ]
    then
        commands
 elif [ expression2 ]
    then
        commands
    else
        commands
 fi
 
 4. Case select 
 
 case string1 in
     str1)
         commands;;
     str2)
         commands;;
     *)
         commands;;
 esac
 
      string1是和str1、str2做比较的。如果其中一个符合string1,那么;;之前相应的命令就会被执行。如果两个都不符合的话,星号后面相对应的命令就会被执行。这是缺省条件执行命令,因为星号符合所有的字符串。
 
 循环语句
 ————
 for var1 in list
 do
     commands
 done
 
     在这个循环中,list中的每个项目都会被执行一次。这个list中的项目可以是一些由空格分开的命令(比如ls或者cat),或者是一些特定的值。每次循环的时候,变量var1就会被赋予当前的项,一直执行到最后一个。
 
 while [ expression ]
 do
     commands
 done
 
 until [ expression ]
 do
     commands
 done
 
     这两个和其他语言中的循环语句差不多,这里就不多做介绍了。
 
 函数
 ——
 1. 建立一个函数:
 
 fname(){
     commands
 }
 
     要调用这个函数的话,直接用fname就可以了。
 
 2. 建立一个带参数的函数
 
 fname2 (arg1,arg2...argN){
     commands
 }
 
     可以用 fname2 arg1 arg2 ... argN 来调用它。
 
 晓湖附:
 ————
     忽闻不雨亦潇对吾与几位兄台的肯定,尔等愧不敢当。是以多写美文一篇以谢对湖某人的赞言。
     今日力牛士庭坛风花雪夜,各路英雄豪杰纷纷踏火而至,无疑对力牛士庭坛的繁荣增加了几份活力。湖某不才,但湖某想说几句苦口婆心的劣言:
     不管各路英雄豪杰的佳作是否原创,是否转载,鄙人认为,只要对在座各位的力牛士水平有助提高,就应该保留,就应该给予肯定。至于与牛力士毫无关系的凡文、反文,如给予保留,对力牛士庭坛无一好处;给予批评,又打击兄长们的积极性。人人皆知,网易庭坛给了大家一个很好的方便,就是纸条传信,大家如果有什么自语私言的话,不如试试这个伎俩,既通达了意思,又保持了庭坛的秩序,何乐而不为?
     湖某多言,勿怪。
 
     (鄙人嗜好广交各路英雄好汉,如有看得起湖某人的,他日可在力牛士聊天陋室一聚。)
 
  ---- 我的Linux配置:
 P200/96M EDO RAM/4.3G+1.5G HD/Cirrus 5446显示卡(2M RAM)/10M Network Adapter with REDHAT 7.1 
 
 http://wangxiaohu.126.com   ICQ:3340023  | 
 
 
 |