龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 操作系统 > LINUX系统 >

Linux shell编程

时间:2011-03-20 22:37来源:未知 作者:admin 点击:
分享到:
一、Shell语法 1.1、变量声明 * 1.2、数组声明和使用1.3、特殊的变量 1.4、运算和运算符 * 1.4.1、整数运算符 * 1.5、流程语句 1.5.1、if 语句 * 1.5.2、case语句 * 1.5.3、select 语句 1.6、循环语句

  一、Shell语法

  1.1、变量声明

  * 1.2、数组声明和使用1.3、特殊的变量

  1.4、运算和运算符

  *

  1.4.1、整数运算符

  * 1.5、流程语句

  1.5.1、if 语句

  *

  1.5.2、case语句

  * 1.5.3、select 语句

  1.6、循环语句

  1.6.1、for语句

  1.6.2、while 语句

  1.6.3、breake 和continue

  1.6.4、shift三、shell程序调试

  四、信号

  五、bash中常用的命令

  SHELL编程

  一、Shell语法

  1.1、变量声明

  变量=值 (注意:等号两侧不能有空格)

  a=”hello”

  b=9

  unset a 撤销变量 a

  readonly a=2 声明静态的变量 a=2 ,不能 unset

  export 变量名 可把变量提升为全局环境变量,可供其他shell程序使用

  变量应用中要注意:

  echo "$1 = $1 ; $2 = $2 "; 屏蔽$1 ,屏蔽 $2 ,直接显示 $1 ,$2,同理*也屏蔽了 * 的通配符作用

  ${SAT}day ,变量要与字符串连在一起时,应该用 ${}

  a= `ls -al` 反引号,运行里面的命令,并把结果返回给变量a

  a=$(ls -al) 等价于反引号

  单引号‘’和双引号“”的区别,单引号完全屏蔽 $a 变量,双引号不屏蔽$a,单引号和双引号都屏蔽 * 的通配符作用。

  1.2、数组声明和使用name[0]="Tom"

  name[1]="Tomy"

  name[2]="John"

  或

  name=("Tom" "Tomy" "John")

  例子:

  #!/bin/bash

  name=("Tom" "Tomy" "John")

  for i in 0 1 2

  do

  echo $i:${name[$i]}

  1.3、特殊的变量

  $0:脚本名字。此变量包含地址,可以使用basename $0获得脚本名称。

  $1:第一个参数

  $2,$3,$4,$5,...一次类推。

  $# 传递到脚本的参数个数

  $* 以一个单字符串显示所有向脚本传递的参数,,以("$1 $2...")

  $$ 脚本运行的ID号

  $! 后台运行的最后一个进程的ID号

  $@ 与$*相同,但是使用时加引号,并在引号中返回每个参数。("$1""$2"...)

  $- 显示shell使用的当前选项。

  $? 显示最后命令的推出状况。0表示没有错误。

  例子:

  #!/bin/sh

  if [ $# -ne 2 ] ; then

  echo "Usage: $0 string file";

  exit 1;

  fi

  grep $1 $2 ;

  if [ $? -ne 0 ] ; then

  echo "Not Found "$1" in $2";

  exit 1;

  fi

  echo "Found "$1" in $2";

  上面的例子中使用了$0 $1 $2 $# $? 等变量,下面是程序的解释:

  判断运行参数个数,如果不等于2,显示使用"用法帮助", 其中 $0 表示就是脚本自己。

  用grep 在$2 文件中查找$1 字符串。

  判断前一个命令运行后的返回值(一般成功都会返回0, 失败都会返回非0)。

  如果没有成功显示没找到相关信息,否则显示找到了。

  其中"表示转义,在"" 里面还需要显示"号,则需要加上转义符"

  参数置换的变量

  1、变量=${参数:-word}:如果设置了参数,则用参数的值置换变量的值,否则用word置换。即这种变量的值等于某一个参数的值,如果该参数没有设置,则变量就等于word的值。

  [ -z "${COLUMNS:-}" ] && COLUMNS=80

  2、变量=${参数:=word}:如果设置了参数,则用参数的值置换变量的值,否则把变量设置成word,然后再用word替换参数的值。注意,位置参数不能用于这种方式,因为在Shell程序中不能为位置参数赋值。

  3、变量=${参数:?word}:如果设置了参数,则用参数的值置换变量的值,否则就显示word并从Shell中退出,如果省略了word,则显示标准信息。这种变量要求一定等于某一个参数的值。如果该参数没有设置,就显示一个信息,然后退出,因此这种方式常用于出错指示。

  4、变量=${参数:+word}:如果设置了参数,则用word置换变量,否则不进行置换。

  字符串匹配的操作:

  ${PARAMETER#WORD} shell 像文件名扩展中那样扩展 WORD,并从 PARAMETER 扩展后的值的开头删除最短的匹配模式(若存在匹配模式的话)。使用 ‘@’ 或 ‘$’ 即可删除列表中每个参数的模式。

  ${PARAMETER##WORD} 导致从开头删除最长的匹配模式而不是最短的匹配模式。

  ${PARAMETER%WORD} shell 像文件名扩展中那样扩展 WORD,并从 PARAMETER 扩展后的值末尾删除最短的匹配模式(若存在匹配模式的话)。使用 ‘@’ 或 ‘$’ 即可删除列表中每个参数的模式。

  ${PARAMETER%%WORD} 导致从末尾删除最长的匹配模式而不是最短的匹配模式。

  ${PARAMETER/PATTERN/STRING} shell 像文件名扩展中那样扩展 PATTERN,并替换 PARAMETER 扩展后的值中最长的匹配模式(若存在匹配模式的话)。为了在 PARAMETER 扩展后的值开头匹配模式,可以给 PATTERN 附上前缀 #,如果要在值末尾匹配模式,则附上前缀 %。如果 STRING 为空,则末尾的 / 可能被忽略,匹配将被删除。使用 ‘@’ 或 ‘$’ 即可对列表中的每个参数进行模式替换。

  ${PARAMETER//PATTERN/STRING} 对所有的匹配(而不只是第一个匹配)执行替换。

  变数设定方式 str 没有设定 str 为空字串 str 已设定非为空字串

  var=${str-expr} var=expr var= var=$str

  var=${str:-expr} var=expr var=expr var=$str

  var=${str+expr} var= var=expr var=expr

  var=${str:+expr} var= var= var=expr

  var=${str=expr} str=expr

  var=expr str 不变

  var= str 不变

  var=$str

  var=${str:=expr} str=expr

  var=expr str=expr

  var=expr str 不变

  var=$str

  var=${str?expr} expr 输出至 stderr var= var=str

  var=${str:?expr} expr 输出至 stderr expr 输出至 stderr var=str

  [ian@pinguino ~]$ x="a1 b1 c2 d2"

  [ian@pinguino ~]$ echo ${x#*1}

  b1 c2 d2

  [ian@pinguino ~]$ echo ${x##*1}

  c2 d2

  [ian@pinguino ~]$ echo ${x%1*}

  a1 b

  [ian@pinguino ~]$ echo ${x%%1*}

  a

  [ian@pinguino ~]$ echo ${x/1/3}

  a3 b1 c2 d2

  [ian@pinguino ~]$ echo ${x//1/3}

  a3 b3 c2 d2

  [ian@pinguino ~]$ echo ${x//?1/z3}

  z3 z3 c2 d2

  字符串子集提取:

  ${x:3:5}

  的值就是 “e val”,

  清单 9. shell 参数值的子字符串

  [ian@pinguino ~]$ x="some value"

  [ian@pinguino ~]$ echo "${x:3:5}"

  e val

  字符串长度:

  您已经知道 $# 表示参数的数量,而 ${PARAMETER:OFFSET:LENGTH} 扩展适用于单个参数以及 $* 和 $@,因此,可以使用一个类似的结构体 ${#PARAMETER} 来确定单个参数的长度也就不足为奇了。清单 10 中所示的简单的 testlength 函数阐明了这一点。自己去尝试使用它吧。

[1] [2] [3] [4] 下一页

精彩图集

赞助商链接