现在的位置: 首页 > 综合 > 正文

[shell]shell编程基础知识总结

2013年09月19日 ⁄ 综合 ⁄ 共 3570字 ⁄ 字号 评论关闭

 

1、shell编程基础

1.1shell中的特殊字符

  • #:注释命令
  • &:在后台执行
  • *:匹配任意长度字符(所以乘法应转义为“/*” 
  • ?:匹配单个字符
  • []:匹配方括号中的任意一个字符
  • [!]:匹配不在方括号中的任意一个字符
  • /:转义字符
  • ;命令分隔符

1.2、输入输出重定向

  • >:输出重定向
  • >>:输出重定向,将信息追加到文件末尾
  • <:输入重定向
  • <<:实现here文件

前两个没什么好说的,下面说一下后面两个:

<输入重定向的格式为:

命令 文件名

似乎后面的“文件名”不能再为命令了。 可以用管道实现类似功能。

<<输入从定向被成为here文件,它将一对分隔符之间的正文重定向输入给命令,其格式如下:

$命令 << 分隔符
输入行
……
输入行
分隔符

另外有错误输出重定向

$命令 2 > 文件名

1.3、管道及命令组合

1.3.1、管道

管道把一个命令的输出传递给另一个命令作为输入,格式为:

命令1 | 命令2

1.3.2、命令执行次序

  • ;:按命令出现的前后顺序执行
  • &:表示在后台执行功能命令
  • &&:且,前面的命令执行成功才执行后面的命令
  • ||:或,前面的命令执行不成功才执行后面的命令

1.3.3、命令组合

shell中有两种方法可以将若干命令组合起来,使其在逻辑上成为一条命令。

  • {}:命令组在本shell内执行,不产生新的进程。
  • ():建立新的子进程来执行命令组,因此在圆括号内执行的命令不会改变父shell的变量值及工作目录 。

2shell变量

shell不支持数据类型,它将任何变量的值都看成是一串字符。但从赋值的形式上可以将变量分为四种形式:用户自定义变量、环境变量、位置变量和预定义的特殊变量。

2.1、用户自定义变量

2.1.1、变量赋值

赋值的形式为:

name=string

注意:

  1. 赋值号的两边不允许有空格
  2. 如果赋给变量的值中包含空格、制表符或换行符,应使用双引号
  3. shell把未赋值的变量看成空字符串
  4. 赋值号右边没有给出字符串时,变量的值也为空

2.1.2、变量的引用

变量赋值后,可以通过在变量名前加$来引用变量

$name

如果变量名出现在一个字符串的中间,该变量前后还有其它一些字符,为了是变量名与其前后的字符分开,需要用花括号把变量名括起来

${a}b

上式引用变量a

另外,只读变量不能用unset删除。

2.1.3、只读变量

有时我们希望在说明一个变量并对它赋值之后就不再改变它的值,这时可以将变量定义为只读变量,其语法格式如下:

readonly namelist

例如:

lonfe@lonfe-laptop:~$ a=2
lonfe@lonfe-laptop:~$ readonly a
lonfe@lonfe-laptop:~$ echo $a
2
lonfe@lonfe-laptop:~$ a=3
bash: a: 
只读变量
lonfe@lonfe-laptop:~$

2.2、环境变量

bash中可以利用env命令列出所有的环境变量值。

  • HOME:用户主目录
  • IFS:域分隔符。默认的有空格、tab和换行
  • LOGNAME:用户名,即登录时用的名字
  • MAIL:用户邮箱的存放路径
  • PATH:命令搜索路径
  • PS1:主命令提示符。普通用户默认为$,超级用户默认为#
  • PS2:次命令提示符,默认为>
  • PWD:用户当前工作目录的绝对路径。随cd命令的使用而变化
  • SHELL:默认的shell的路径
  • TERM:使用的终端类型

2.3、位置变量

2.3.1、位置变量及引用

shell执行用户的命令时,把命令的第一个字符串作为执行程序名,用$0来引用。后面字符串作为程序的参数,分别用$1-$9来引用。

2.3.2shift命令

因为只有9个位置变量,当程序的参数超过9个的时候就需要使用shell内部提供的shift命令。

shift命令的功能是将位置变量左移,格式如下:

shift [n]

2.3.3、用set命令给位置变量赋值

set命令的功能是设置各种shell选项、位置变量及列出shell变量,其格式如下:

set [选项] [参数]

不带任何选项及参数的set命令将显示shell的全部变量。

set命令中键入的参数将依次赋值给位置变量$1-$9$0不能用这种方法赋值。

另外,利用unset命令可以删除变量的值,其格式如下:

unset [选项参数

2.4、特殊变量

shell中还有一组特殊变量,这组变量由shell定义及设置,用户只能引用这些变量,但不能重新设置它们。

特殊变量 说明
$# 命令行上的参数个数,但不包含$0
$? 命令行的退出代码,0表示成功,其它数值表示失败
$$ 当前运行程序的进程号
$! 最后一个后台运行进程的进程号
$* 命令行所有参数构成的一个字符串
$@ 命令行所有参数,但每个参数用引号括起来

2.5、变量的条件替换

2.5.1、设置变量默认值

${var:-value}

若变量var有非空值则取var的值;否则取value的值,var的值不变

2.5.2、改变变量的值

${var:=value}

若变量var有非空值择取var的值;否则取value的值,同时将var的值赋值为value

2.5.3、在变量已赋值时进行替换

${var:+value}

若变量var有非空值则取value的值;否则取var的值(即空值),且var的值不变

2.5.4、带错误检查的变量替换

${var:?message}

若变量var有非空值则取var的值;否则显示错误信息:varmessage

2.6、特殊字符的引用

有些字符对shell有特殊含义,当用户不需要这些字符的特殊含义时就要消除其特殊含义。消除特殊字符含义的机制称为引用或转义。

2.6.1、双引号

双引号能消除大多数字符的特殊含义,但不能消除$(美元符号)、`(反引号)和/(反斜杠)的特殊含义。

2.6.2、单引号

单引号与双引号的工作方式类似,但是单引号可以消除所有字符的特殊含义

2.6.3、反引号

反引号括起来的字符被shell解释为命令。在执行时,shell首先执行该命令行,并以它的标准输出结果取代整个反引号(包括两个反引号)部分。

4、算术运算及条件语句

4.1、变量的算术运算

Bash只能进行两个整数间的运算,其结果仍然为整数。要进行算术运算,需要使用expr命令或let命令。

4.1.1expr命令

expr命令的功能s是计算表达式的值。该命令将其参数看做表达算术式,它计算该表达式的值并将结果送到标准输出设备上,其语法格式如下:

expr 操作数 运算符 操作数

4.1.2let命令

letbash的内部命令,其功能与expr类似,也能计算算术表达式的值,其语法格式如下:

let 赋值表达式 [赋值表达式]

注意:

  1. let支持C语言中的大部分整数运算,可以在表达式中直接使用变量,而不需要在其前面带$符号。
  2. 当let计算表达式的值时,若最后一个表达式的结果不为0则返回0值,否则返回1值。

4.2、条件语句

条件语句test用来测试后面所给的条件表达式的真假。若为真则返回0,否则返回1。test命令的一般格式为:

test 条件表达式

或者

[ 条件表达式 ]

注意:使用方括号时,要注意在条件两边加空格。

使用test命令可以进行多种类型的条件测试,包括:字符串测试数值测试和文件状态测试。

4.2.1、字符串测试

表达式 含义
sring1=string2 如果字符串string1string2相等,则结果为真
string1=sring2 如果字符串string1string2不相等,则结果为真
test -n string 如果字符串string的长度不为0,则结果为真
test string 如果字符串string的长度为0,则结果为真
test -z string 如果字符串string的长度不为0,则结果为真

4.2.2、数值测试

表达式 含义
int1 -eq int2 如果int1等于int2,则结果为真
int1 -ne int2 如果int1不等于int2,则结果为真
int1 -gt int2 如果int1大于int2,则结果为真
int1 -ge int2 如果int1大于等于int2,则结果为真
int1 -lt int2 如果int1小于int2,则结果为真
int1 -le int2 如果int1小于等于int2,则结果为真

4.2.3、文件状态测试

表达式 含义
-r file 如果文件存在且可读,则结果为真
-w file 如果文件存在且可写,则结果为真
-x file 如果文件存在且可执行,则结果为真
-f file 如果文件存在且为普通文件,则结果为真
-d file 如果文件存在且为目录文件,则结果为真
-z file 如果文件存在且长度大于0,则结果为真

4.2.4、逻辑运算符

上述条件测试语句可以单独使用,也可以通过逻辑运算符将它们组合起来使用。

表达式 含义
!expr
expr1 -a expr2
expr1 -o expr2

5、shell的控制语句

6、循环控制语句与变量作用域

7、函数

8、shell脚本的调试

 

抱歉!评论已关闭.