Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1464680
  • 博文数量: 842
  • 博客积分: 12411
  • 博客等级: 上将
  • 技术积分: 5772
  • 用 户 组: 普通用户
  • 注册时间: 2011-06-14 14:43
文章分类

全部博文(842)

文章存档

2013年(157)

2012年(685)

分类: LINUX

2012-05-14 19:22:04




Shell有不同的风格,最常用的包括Bourne Shell(bsh)、Bourne Again Shell(bash)、C Shell(csh)、Korn Shell(ksh)和Perl Shell等。

Shell语言是区分大小写的。“#”表示注释。


I/O重定向,Linux系统中,数据流可分为3类:数据输入、数据输出和错误输出。它们对应的文件描述指针分别为0、1和2。可以使用重定向来改变数据流的流向:
> 文件 :输出结果重定向到文件
&> 文件:输出结果和标准错误输出一起重定向到文件
>> 文件:输出结果追加到文件
2> 文件:标准错误的输出重定向到文件
< 文件:将文件作为标准输入
<< 字符串:从标准输入中读取数据,如直到接收到指定字符串。


管道:将程序的输出结果导入到另一个程序来作为输入数据。如ls | cat。|&将标准错误输出一起送入管道。


前台与后台:前台运行时,Shell要等待命令结束,才能恢复自身的运行;后台运行时,Shell不必等待命令结束,就可执行下一命令。command &启动一个后台进程。

多个命令在同一行可以用分号“;”分隔,命令将依次被执行。如:echo hello;pwd;ls。“&&”连接两个命令时,前一命令成功才执行后一命令,如ls dir && cd dir。而“||”连接命令时,前一命令不成功时才执行后一命令,如ls dir/sub || cp sub dir。


通配符:“?”表示任意的单个字符,如a?c可以匹配abc。“*”表示任意长度的任意字符串,如a*d可以匹配 abcd。“[]”表示匹配放在中括号里的字符集中的任意一个字符,如a[bdf]c匹配abc。“{}”匹配大括号中的某个字符串,如 a{bc,ef}d匹配abcd。


引号有三种:
双引号(" "):除了“$”、“"”、“`”和“\”以外的字符都被解释成字符本身。例:echo "$PATH" 输出变量$PATH的值。
单引号(' '):所有特殊字符都不再有特殊意义,都被视为普通字符。例:echo '$PATH' 输出字符串“$PATH”。
反引号(` `):字符串被解释成命令。例:ehco `ls`输出与命令ls一样的字符串。

在脚本文件第1行可以指定使用的shell,例如:#!/bin/bash或#!/bin/tcsh。之后把文件作为可执行程序时,会自动作为指定的脚本语言运行。


运行脚本的方法有三种:
通过chmod u+x scriptfile把文件设置为可执行程序;
使用shell启动命令,bash scriptfile或tcsh scriptfile或sh scriptfile,sh是bash的一个链接;
使用bash内部命令source scriptfile或. scriptfile。

Shell的测试命令的语法格式为:
test 表达式
或者
[ 表达式 ] (“[”后以及“]”之前要有空格)

例:test 1 -gt 2测试1是否大于2。test通常与if、while、until等语句一起使用。


表达式有以下类型:

测试文件属性

-b file:如果文件 存在且为块设备(Block special),则值为真;

-c file:如果文件存在且为字符设备(Character special),则值为真;

-r file:如果文件存在且为只读,则值为真;

-w file:如果文件存在且可写入,则值为真;

-x file:如果文件存在且可执行,则值为真;

-s file:如果文件存在且长度大于零,则值为真;

-d file:如果文件是一个目录,则值为真;

-f file:如果文件是一个普通文件,则值为真;

-e file:如果文件存在,则值为真。


测试数值

n1 -eq n2:n1等于n2,则值为真;

n1 -ne n2:n1不等于n2,则值为真;

n1 -gt n2:n1大于n2,则值为真;

n1 -lt n2:n1小于n2,则值为真;

n1 -ge n2:n1大于等于n2,则值为真;

n1 -le n2:n1小于等于n2,则值为真;


测试字符串

-z s1:如果s1长度为零,则值为真;

-n s1:如果s1长度不为零,则值为真;

s1 = s2:如果s1与s2相等,则值为真;

s1 != s2:如果s1与s2不等,则值为真;

s1:如果s1不是空串,则值为真;


测试逻辑运算符

-a:二元“与”操作符。例:if test $x -gt $y -a $y -gt $z。

-o:二元“或”操作符。

!:一元“非”操作符。例:if test ! $x -eq $y。

hell中变量的类型分为:


环境变量:Shell预定义的,用于设置系统运行环境的变量,由系统统一命名。常用的有HOME:用户主目录的全路 径名;PATH:执行命令或Shell脚本时的查找路径,不同路径由冒号分隔;TERM:终端类型;PWD:当前工作目录的绝对路径;PS1:主提示符。 根用户默认为“#”,普通用户默认为“$”,可以重新设置该值;PS2:辅助提示符,命令行中输入“\”再按回车,将显示辅助提示符,默认为 “>”;SHELL:Shell解释器的路径;MAIL:系统信箱的路径;LOGNAME:登录用户的用户名;UID:当前用户的UID。env或 set命令可以显示 和设置当前环境变量。

位置变量:命令可以接受多个参数,如command arg1 arg2 ...。在脚本中,可以通过位置变量来得到这些参数。$0对应当前执行的命令名,$1~$9表示第1到第9个变量。shift可以用来将参数左移,比如 shift操作后,$1将等同与原来的$2。shift 2移动两位,使$1等同于原来的$9。多于9个参数时需要shift来读取多于9位的参数。

预定义的特殊变量:与环境变量类似,不同的是该类变量具有特殊的含义,其值不能由用户重新设置。常用的有:$#:实 际位置参数个数(不包括Shell脚本名),$*:命令行中的所有位置参数组成的字符串;$!:上一个后台命令对应的进程号;$?:最近一条命令执行后的 退出状态(返回值),为十进制数;$$:当前进程号PID。

用户自定义变量:建议使用大写字母表示,与命令名相区别。


变量的操作有:

创建变量:内置命令declare和typeset可用于创建变量,例如declare -r可创建只读变量。不带任何选项的declare命令列出所有设置的变量。变量名=变量值的方式可以直接创建变量,如VAR=20。使用变量时用$变量的方式,如$VAR。

区分变量名:变量和字符串混用时,容易引起混淆。定义变量NAME=tommy,命令echo "my name is $NAME123"会输出“my name is”,因为变量NAME123不存在,用花括号来区分:echo "my name is ${NAME}123”。

删除变量:unset 变量名。


变量的赋值可以使用以下方法:

使用read命令赋值:从标准输入或文件读取数据。如:read 变量1 变量2,此时脚本暂停执行而等待键盘的输入。多个数据或变量之间用空格分隔;若变量个数与数据个数相等,则对应赋值;若变量个数更多,则没有输入数据的变 量取空值;若变量个数更少,则将多余的数据赋值给最后一个变量。如果read成功,则返回0,如果读到EOF,则返回非零值。

直接给变量赋值:变量名=变量值。赋值时不能使用美元符“$”,且等号前后不可有空格。

使用命令行参数赋值:用户向命令行传入参数,使得$1~$9有值。

利用命令的输出结果赋值:使用反引号(`)。如:CURRDIR=`pwd`。

从文件读入数据实现赋值:例如脚本:
ls * > files
while read LINE
do
    echo $LINE
done < files
表示while结构从文件“files”里每次输入一行并输出到标准输出。


变量的输出有以下方式:

echo命令:直接输出变量的值。

printf命令:格式化输出变量。与C语言不同,这个printf命令的参数之间不需要逗号分隔:printf "%d" 59。type printf命令可以输出命令printf的类型。


数组变量

数组的定义:array=(1 2 3 4 5)定义一个数组并赋值。而a[0]=1 a[1]=2 a[2]=3同样创建一个数组。通过${array[1]}的形式可以使用数组元素。

数组的复制:两个特殊索引“@”和“*”,可以用来复制数组。例如:copy=(${array[@]})与 copy=(${array[*]})等价,都将array数组复制到copy数组里,而带引号时,copy=("${array[@]}")与 copy=("${array[*]}")意义不同,前者仍然把数组array复制到数组copy里,两个数组元素相同;而后者把array数组里的所有 元素以分隔符(通常是空格)分开作为一个元素传入copy里,此时copy只有一个元素。不带圆括号的赋值也是这个效果:copy=$array[@]与 copy=$array[*]都将得到一个元素个数为1的数组。(其实就是一个普通变量。)

数组元素的个数:${#array[*]}返回数组的元素个数。

数组元素的长度:${#array[2]}返回下标为2的元素的字符串长度。


算术运算
Bourne Shell没有内置的算术运算,不能直接加、减、乘、除。对于整型运算可以使用expr或let,而浮点或更复杂的运算可以使用awk或bc。

expr
:x=`expr $a + $b`。此处是反引号。

let
:let x=x+1。

awk
:result=`awk 'BEGIN {x=1.2;y=2.3;printf "%f",x+y }'`。整个awk命令被反引号包含。
阅读(418) | 评论(0) | 转发(0) |
0

上一篇:Linux Shell编程--函数

下一篇:Linux grep

给主人留下些什么吧!~~