shell编程基础
2012-10-10 08:50
246 查看
http://blog.163.com/fang___wei/blog/static/27445565200981834522257/
收藏着,以便平时参考
第一章:概述
一、 shell 概念
shell 是unix操作系统提供的命令解释器,是用户与操作系统之间的接口。当你注册到unix系统的任何一个用户,系统都会为你启动一个shell,shell会一直等待你的指令,当你输入的命令被确认后,shell便对其进行解释并产生系统调用,完成相应的操作。然后,又进入等待状态。
换句话说,当你一登录到unix系统,就开始了与shell的对话。在此期间,你不断与shell交互,不断地对shell发出命令来指挥系统完成各种工作直到你退出系统。
事实上unix提供了三种shell,分别是Bourne Shell、C-Shell、Korn Shell。这三种Shell大体相同,只在某些地方有所区别。其中Bourne Shell在各种不同的UNIX版本中都是一致的,所以也叫标准Shell。而其它几种Shell不能简称,必须全称,这是为了不必要的混淆。对于每一个用户来讲,执行一个程序只能选择其中一种Shell,一般是Bourne Shell。当然也可以使用其他Shell,这需要在建立用户的时候指明,或在具体执行某一程序时特殊指定你所选择的命令解释器。下面将要介绍的内容如非特别声明都是针对Bourne
Shell的。
二、 Shell的特点和优点
1、 输入/输出的重定向可以很轻易的改变输入输出的来源和目的地。
2、 连接管道可以将一命令的输出作为另一命令的输入。
3、 可将Shell命令键入一个文件,通过执行这个文件来达到执行若干命令的目的。
4、 在不中断前台的操作的情况下,可通过后台方式运行其他命令。
5、 可以把系统命令、Shell命令进行适当的组合,构成一个新命令。
6、 可以执行多种命令,包括Shell内部命令、UNIX系统命令、编译好的可执行文件、甚至是Shell 传递的位置参数。
三、 一个简单的Shell程序
vi test
pwd
cal
在命令行“#”后键入sh test并回车,其结果为:先显示当前路径,然
后再显示日历。这个test就是Shell程序,当然是一个简单的Shell程序,
它只有两行:一行是pwd,另一行是cal.
第二章:Shell基础知识
一、 特殊符号
在Shell中有一些符号具有特殊的含义,可以用来实现某些功能,现叙述如下:
1、 星号(*):可以匹配任何字符串,包括空串。如:echo * 命令将显示当前目录下的所有文件和目录名,lf aa* 将显示所有以aa开头的文件名。使用 * 做匹配符时,应特别小心,如rm * 将删除目录下的所有文件。
2、 问号(?):可以匹配文件名中的任何单个字符。如用lf a??d 命令来显示当前目录下的文件时,其结果可能为:abcd、aacd、aaad等。
3、 中括号([]):可以匹配一个集合的元素。如果[crf]作为一个文件名模式的一部分,Shell将可以查到指定位置的字母为c、r或f的文件名。例如:lf [crf]at 命令的结果可能为:cat、fat、rat等。
中括号也能用于指定的一个字符域,无论是数字还是字母。如:lf chapter[1-9] 其结果将是可能存在的chapter1,chapter2…等文件名。
4、 后台执行符号(&):如果一个程序运行的时间很长,并且不是一个交互式
程序的话,就可以用 & 号使程序以后台的形式执行。其格式为:command &。
5、 分号(;):可以让你在一个命令行或程序的一行中执行多个命令。例如:
#cd;pwd。
6、 反斜杠(\):用于取消特殊字符的特殊含义。例如:lf aa\* 命令将查找
当前目录是否有名为aa*的文件,与lf aa* 命令的含义截然不同。
7、 单引号(‘ ’):取消除单引号以外的任何字符的特殊含义。例如:echo
‘my name is $name’其结果为:my name is $name,此时$只作为一个普
通字符使用了。
8、 双引号(“ ” ):取消除双引号、$号以及_号以外的所有字符的特殊含
义。单引号更加具有强制性。
9、 输入转向符(<):用于指定输入的设备或文件。如:mail root
则将文件message的内容发送给root。
10、输出转向符(>):用于将输出发送到指定的设备或文件中。如:lf>myfile
其结果是将lf的执行结果放到文件myfile中(同时清空文件中原有的数
据),而不显示到屏幕上。又如:将错误输出到重定向到空设备 2>/dev/null。
11、追加符号(>>):用于将命令的输出追加到某个文件中。如:lf >>myfile
其结果是将lf的执行结果追加到文件myfile中(文件原有的数据予以保
留),而不显示到屏幕上。
12、管道符号(|):可以将一个命令的输出作为另一个命令的输入,而不需建
立临时文件,以这样的方式建立的多命令行称为管道线。如:ls|more
将ls 的结果传递给more,由more来分屏显示。
13、改向符号(<<):常用于建立一个here文件。
14、&&和||:其作用是使命令有条件的执行。如:
command1 && command2:当且仅当command1执行成功后才执行command2
command1 || command2:当且仅当command1执行失败后才执行command2
二、 变量
Shell的变量不分类型,或者说只有字符串型变量,所以要使用数值运算则必须靠外部命令达到目的。而其变量种类有以下几种:
1、 用户自定义变量
在Shell中,这是最常用的变量,在程序中变量不需要事先说明,没有类型之分,也没有全程、局部的区别。变量可以随时随地定义,其名称是以字母开头的不包括空白字元的任何字符串,长度不限。其使用范围只限于程序运行期间,程序执行完毕,该变量即不复存在。
定义变量的格式: 变量名=字符串 (例:name=Tom)
其中,字符串可以是空串,表示变量被赋予空值。
引用一个变量时,在变量前加一$号即可。
Name=Tom (变量name被赋予字符串值Tom)
echo $name (显示变量name的值)
执行结果为:Tom
2、 系统变量(环境变量)
和自定义变量相似,系统变量只不过是在用户注册到系统的时候,由
系统自动赋值的,并且它的值会自动传递到各层Shell并能够被其所执行的
程序所调用。除非在程序中对环境变量进行修改,否则其值不会随Shell
程序的运行而改变,要将一个用户自定义变量设定为环境变量,只需用
export命令声名即可,例如:
name=Tom
export name
以下是用户一进入系统之后就已设定好的环境变量:
$HOME:用户自己的主目录
$PATH:执行命令时所搜寻的目录
$TZ :时区
$PS1 :命令行上的提示符
$PS2 :当命令尚未书完时,Shell要求继续输入时的提示符
3、 特殊变量
有些变量一开始执行Shell程序时就被自动设定的,一般不能进行修改,以下是一些特殊变量:
$0 Shell程序的执行名
$n Shell程序(或过程)的第n个位置参数值,n=1..9
$* Shell程序所有位置参数组成的字符串
$# Shell程序的位置参数的个数
$$ 程序执行后的进程号
$! 最后一个后台指令(程序)执行后的进程号
$? 命令执行后的返回值,返回0表示成功,返回1表示失败
其中,$n又叫位置变量,它是调用(运行)一个Shell程序时,跟在程序名后面的各个参数,最多可以有10个,例如:
#sh myprogram 15 20
则在程序中$1=15,$2=20
当你执行Shell时,如果参数的数目超过9个时,可以使用Shift命令将参数向前移动一格,如此便可以使用超过9个的参数。
三、 输入输出语句
1、 read 语句
read语句用于从键盘接收一个或多个值并把它们赋予相应的变量。
用法:read 变量名1 [变量名2,变量名3...]
例如:read a b
echo $a
echo $b
运行并输入 aaa bbb 回车后将显示:
aaa
bbb
需要注意的是,如一次需输入多个值,每个值之间要以空格来分隔,全
输入后再打回车确认。
如输入的字段值个数少于语句中变量的个数时,多出的变量将赋予空值。
如输入的字段值个数多于语句的变量个数时,多出的参数值被丢弃。
通常使用的方式是一次读入一个数据 ,即read 后只跟一个变量。
2、 echo 语句
echo 语句用于向标准输出设备输出字符串或变量的值。
用法:echo 字符串 或 echo 变量名1[变量名2,变量名3...]
例如:echo I am a student
echo 语句中还可以用一些控制字符对格式进行控制,常用如下:
\b 空一格,是显示行首为一个空格
\c 显示后不换行,下次显示时紧跟其后显示
\f 先清屏后在屏幕顶端显示
\n 换行,显示后多增加一空行
\r 回车
\t 显示时增加一个制表符
\v 垂直制表符
\\ 显示一个反斜杠
四、 赋值语句
1、 字符串:是最常用的赋值方法,等号后面跟一个后多个字符串。
如:name=John
name=”John Tom”
2、 read 语句:把键盘输入的值赋予变量。
如:read key (从键盘接收一个值并将其赋予变量key)
3、 用命令的结果赋值:通过反单引号把某个命令的输出赋予变量。
如:name=`pwd`
4、 用位置变量赋值:把命令行上的某一参数的值赋予变量。
如:name=$2 (把第二个位置参数的值赋予变量name)
五、 执行命令
在Shell中执行一个命令有五种方法,具体如下叙述:
1、 直接执行命令
在程序中通过调用命令名直接运行系统命令,如:lf 这种方式和在命令
中直接下命令的效果一样,也是最常用的执行方式。
2、 使用sh命令
在程序中通过sh command的形式运行其它Shell程序。这种方式除了这
个程序可不具有执行权限外和直接执行命令的形式一样。
3、 使用”.”命令
在程序中以 .command的形式运行命令(程序)。这时和使用sh命令相似,
只不过它不像sh一样会产生新的进程,相反,它会在原有的进程下完成。
4、 使用exec命令
在程序中以exec command的形式运行命令(程序)。此时这个Shell程
序将会被所执行的命令所取代。当这个命令执行完毕之后,这个Shell程序
也会随之结束。
六、 流程控制
1、 for 语句
for语句是一个循环语句,其循环的次数由实参表中的参数个数决定,每
次循环都执行一遍关键字do和done之间的语句。
语法为: 流程图如下:
| 没有了
for 变量名 in 实参表 |—-<实参中还有东西吗?>—|
do | |有 |
命令序列 | 从实参表中取得一 |
done | 项放到变量中 |
| | |
| 执行命令序列 |
| | |——–|
|———–| |
例题1: |
for a in xx yy zz
do
echo $a
done
结果如下:
xx (第一个循环变量a被赋值xx,由echo $a将其值显示出xx)
yy (第一个循环变量a被赋值yy,由echo $a将其值显示出yy)
xx (第一个循环变量a被赋值zz,由echo $a将其值显示出zz)
当实参表中没有可用赋值的参数时,循环就结束了。
例题2:将当前目录下的文件名都加上一个后缀.txt
for file in `lf`
do
mv $file $file.txt
done
2、 while 语句
while 语句也是一个循环语句,它的循环次数由测试语句的返回值来决
定,除非返回值为假,否则while语句将一便又一便地反复执行关键字do
和done之间的语句。
语法: 流程图
| 假
while [ 判断语句 ] |———<判断语句> ———|
do | |真 |
命令序列 |—————| |
done |
|—————-|
|
例题:
number=0
while [ $number –lt 10 ]
do
echo “$number\c”
number=`expr $number + 1`
done
结果:0123456789
3、 if 语句
if 是非循环语句,但也不是严格意义上的顺序执行语句,它对状态进行
判断,当且仅当测试语句的返回值为真时才执行关键字then后面的语句。
语法: 流程图
| 假
if [ 判断语句 ] <判断语句>——|
then |真 |
命令序列 命令序列 |
fi |————-|
|
例题:文件名为chk
if [ $# != 0 ]
then
echo “Arg1:$1”
fi
执行 chk Hello
结果: Arg1:Hello
4、 if then else 语句
是 if 语句的加强,此语句当且仅当测试语句的返回值为真时去执行关
键字then后面的命令,否则便执行关键字else后面的命令。
语法: 流程图
| 假
if [ 判断语句 ] <判断语句>——|
then |真 |
命令序列1 命令序列1 命令序列2
else | |
命令序列2 |————|
fi
例题:if [ $a –le 10 ]
then
echo”little”
else
echo “large”
fi
5、 if then elif 语句
是if语句的嵌套形式,即一个if语句中再嵌套另一个if语句。
语法: 流程图
| 假
if [ 判断语句1 ] <判断语句1>——|
then |真 | 假
命令序列1 命令序列1 <判断语句2>——|
elif [ 判断语句 ] | |真 |
then | 命令序列2 命令序列 3
命令序列 2 |————-|—————-|
else |
命令序列3
fi
例题:输入三个数,显示它们的相等情况
read word1 word2 word3
if [ $word1=$word2 –a $word2=$word3 ]
then
echo “word1=word2=word3”
elif [ $word1=$word2 ]
then
echo “word1=word2”
elif [ $word1=$word3 ]
then
echo “word1=word3”
elif [ $word2=$word3 ]
then
echo “word2=word3”
else
echo “No match”
fi
6、 case 语句
case语句经常用于多重选择,它允许你选择几个模式之一,然后执行哪
个模式的命令序列,其中关键字case和esac必须成对使用,每个模式最后
必须是;;
语法:
语法: 流程图
| 真
case 变量名 in ——命令序列1——|
pat1) 命令序列1;; |假 真 |
pat2) 命令序列2;; ——命令序列2——|
pat3) 命令序列3;; |假 真 |
esac ——命令序列3——|
|假 |
|———————————-|
其中pat字段除了可以指定一些确定的字串,也可以指定字符串的集合:
* 任意字串
? 任意字元
[abc] a,b,或c三字元之一
[a-n] 从a到n的任一字元
| 多重选择
例题:
echo ‘Enter A,B,or C:\c’
read letter
case $letter in
A|a) echo ‘You entered A.’;;
B|b) echo ‘You entered B.’;;
C|c) echo ‘You entered C.’;;
*) echo ‘Not A,B,or C.’ ;;
esac
7、 continue 和 break 语句
这两者都用于for、while以及until循环语句。其中,break执行后将
跳转到done后面执行(也即跳出循环),而continue会跳到do后面,继续
执行下一个循环。
Continue语句跳过循环体中该语句之后的语句,直接进行下一个循环。
例如:
a=0
while [ $a –le 4 ]
do
a=`expr $a + 1`
if [ $a –le 2 ]
then
echo “little”
continue
fi
echo “large”
done
执行结果:little(显示little后continue忽略以后的语句,进入下一循环)
little(显示little后continue忽略以后的语句,进入下一循环)
large
large
break语句直接跳出循环,而不管循环是否正常结束,通常用于无条件循环语句。
例如:a=0
while [ $a –le 5 ]
do
a=`expr $a + 1`
if [ $a –ge 3 ]
then
break
fi
echo “little”
done
echo “end”
执行结果:little
little
end
七、 过程
所谓过程,就是一段Shell程序。当一个程序达到一定长度的时候,程序
的调试和阅读就变的比较困难,通常要将程序划分成若干段落,把完成同一主
题的若干语句组织到一起,就是一个过程。
格式: 过程名()
{
命令序列
}
例如:
menu()
{
clear
echo “\n\n\t\t 1) 关闭系统“
echo “\n\n\t\t 2) 强行关闭“
echo “\n\n\t\t 3) 重新测试“
echo “\n\n\t\t 请输入选择:\c”
}
此过程的过程名叫menu,过程体中首先进行清屏,然后显示了一个简单的菜单。过程对于需要经常重复执行的一组命令非常有用,将这组命令放入一个过程中,以后当需要执行的时候只要调用这个过程名即可。
在过程中的语句可以通过参数传递接收过程外部的变量值,方法如下:
1、 直接使用外部定义的变量。
如:a=10
Check()
{
. . . .
sum=`expr $a + 5`
. . . .
}
2、 使用位置参数
如:Check()
{
echo $1
}
则在程序中以如下方式调用:Check hello
执行时过程中的显示语句回将hello显示出来。
在Shell程序中执行每一个命令都会有一个返回值,过程也不例外,你可以根据情况用return命令来定义这个值。
例如:Check()
{
if [ $sum –eq 100 ]
then
returnno=0
else
returnno=9
fi
return $returnno
}
check
echo $?
执行结果为:9
这样做的好处是可以根据过程的返回值知道过程执行的情况如何,但要注意,return语句所能返回的只能是数字,有字母组成的字符串将被视为非法。
过程的定义不分先后,可随时随地定义,一经定义就可使用。但过程定义后必须调用才可起作用,不经调用等于每定义。
在编写一个Shell程序时,尽量使用过程是一个好的习惯。这样会使程序变的容易阅读,结构功能一目了然。最好是把所有语句都分别包含在各个过程中,最后在定义一个主过程,用来调用其它子过程。如:
Ready()
{ . . . . . . }
Getsh()
{ . . . . . . }
Trans()
{ . . . . . . }
Loads()
{ . . . . . . }
main()
{
Ready
Getsh
Trans
Loads
}
main
八、 expr 命令
Shell提供expr命令来完成算术运算。
命令格式:expr expression
例如:number=`expr $number + 1`
通常expr命令只将运算结果输出到标准输出上,如果要将结果赋给某个
变量,就要用到命令替换的方式。上面的例子是将number变量的值加1后再赋
给number变量。
Expression是由字符串以及运算符组成,每个字符串或是运算符之间必
须用空白隔开。否则expr不会计算表达式,而是直接将表达式输出。下面是运
算符的种类及功能,而优先级则以先后次序排列,我们可以用小括号来改变运
算符的优先次序。
1) * 乘法 8)= 等于
2) / 除法 9)!= 不等于
3) % 取余数 10)>= 大于等于
4) + 加法 11) > 大于
5) – 减法 12) & AND运算
6) < 小于 13) | OR运算
7) <= 小于等于
当expression中含有”*”,”(“,”)”等符号时,必须在其前面加上“\”以取消它的特殊含义,以免被Shell解释错误。
例如:a=`expr 2 * ( 3 + 4 )` 是错误的
正确的方法应为:a=`expr 2 \* \( 3 + 4 \)`
而b=`expr 1.2 + 1` 也是错误的,因为expr只能处理整数运算。
此外,利用expr命令还可以完成获得字符串长度的功能。
例如:cxsh=”0000135”
l=`expr length “$cxsh”`
执行后的结果为:7
九、 条件测试语句
Shell提供测试语句来测试各种条件(通常用于控制语句中)。测试语句
以中括号[]括住测试条件,中括号前后需留有空格,几种测试条件如下:
1、 字符串测试:用于测试两个字符串是否相等。
[ string1 = string2 ] 字符串string1和string2是否相等
[ $name =’Johne’ ] 变量name的值是否为字符串John
[ $name = $string ] 变量name的值是否等于变量string的值
[ $string ] 变量string的值是否为空
[ -z string ] string的长度是否为0
[ -n string ] string的长度是否不为0
[ “string” ] string的长度是否为0
[ string1!=string2 ] 字符串string1和string2是否不相等
[ $name!=’Jone’ ] 变量name的值是否不等于字符串Jone
[ $name!=$string ] 变量name的值是否不等于变量string的值
[ !”string” ] 变量string的值是否不为空
例如:if [ “$name” ]
then
echo “name:not empty”
else
echo “name:empty”
fi
2、 文件测试:用于测试文件的各种属性。
[ -f $file ] 名为$file的文件是否存在
[ -r $file ] 名为$file的文件是否存在并可读
[ -w $file ] 名为$file的文件是否存在并可写
[ -x $file ] 名为$file的文件是否存在并可执行
[ -s $file ] 名为$file的文件是否存且大小不为0
[ -d $file ] 名为$file的目录是否存在
以上测试条件中,文件名可以是字符串也可以是变量。
在判断条件之间加!号,其意义与以上相反,如:
[ ! -f $file ] 以变量$file的值为名的文件是否不存在。
[ ! -r /unix ] 名为unix的文件是否不存在或不可读。
举例:if [ -f /tmp/test ]
then
echo “file /tmp/test:exist”
else
ehco “file /tmp/test:not exist”
fi
3、 数值测试:若字符串由数字组成,则可进行数值测试。
[ string1 -eq string2 ] 数字string1是否等于数字string2
[ string1 -ne string2 ] 数字string1是否不等于数字string2
[ string1 -lt string2 ] 数字string1是否小于数字string2
[ string1 -le string2 ] 数字string1是否小于等于数字string2
[ string1 -gt string2 ] 数字string1是否大于数字string2
[ string1 -ge string2 ] 数字string1是否大于等于数字string2
其中,string1和string2可以是数字值或为数字的变量。
例如:if [ $No1 -eq $No2 ]
then
echo “$No1 equal $No2”
else
echo “$No1 not equal $No2”
fi
以上三种测试返回0时为真,非0值为假。此外在测试条件中,还可以配合逻辑运算符作各种情况的测试,Shell提供下列逻辑运算符:
-a 或 and 逻辑与,即几个条件同时成立其结果才为真
-o 或 or 逻辑或,即几个条件中只要有一个成立结果就为真
! 或 not 逻辑非,取条件的反值
如:[ -f file1 –a –r file2 ]
表示当文件file1存在并且文件file2存在且可读的情况下,返回值才为真。
十、 trap 命令
trap命令的作用主要是信号拦截,根据使用方式,可分为以下几种:
1、来关闭一个信号(使这个信号被忽略)。
2、重新定义这个信号的动作。
3、恢复原有的缺省动作。
信号的概念:指由系统(核心)、程序或kill命令发出的,旨在通知执行程序某件事的发生,并使程序完成相应信号所对应的动作。UNIX操作系统定义了若干信号,分别对应于一个数字。其中较为常用的信号如下:
0: 退出Shell时产生,即按Ctrl-D.
1: 挂断,终端被切断时,核心将此信号发送到该终端控制的进程。
2: 中断,按Delete,Ctrl-Break,Ctrl-C时产生。
3: Quit, 控制终端的停止键被按下(Ctrl-\)。
9: 删除一个或一组进程。
15: 软件结束(中断)信号。通常由kill命令传出。
使用方法:
忽略信号的命令格式为: trap “” 信号序列
重新定义信号动作的命令格式为: trap 命令序列 信号序列
恢复信号原有缺省动作的格式为: trap 信号序列
其中,命令序列可以是一个或若干个命令甚至函数,不能为空。
如:’clear;exit’
信号序列是由一个或若干个中断号组成,中断号之间以空格分开。
如:1 2 3 5
先将trap三种格式的使用方法和结果分述如下:
1、 trap “” 信号序列:在程序头加上次种格式的trap命令,将
使程序忽略程序执行中收到的信号序列中的信号,它使系统中定义的该信号
对应的动作变为空。
2、 trap 命令序列 信号序列:在程序头使用此种格式的trap命令,
将使程序在接收到的信号序列中的信号时,去执行命令序列中的命令,它使
系统中定义的该信号对应的动作改变为命令序列中的命令。
3、 trap 信号序列:此种格式将恢复系统定义的信号序列中各信号
所对应的缺省动作值,也就是将1、2两种命令设定的动作改回缺省值。
Trap 命令经常用于程序被中断时删除临时文件。
如:trap ‘rm /tmp/linshifile;clear;exit’ 2
如希望程序在执行时不被“骚扰”,则可用:trap “” 命令序列
如:trap “” 1 2 3 15
则系统或者其它用户kill命令发出的1、2、3、15等信号将无法中
断该程序的执行,但信号9将无法拦截。
十一、Here 文件
Here文件实质上是一种重定向的应用。它允许你将一小段数据放在Shell文件中,通过转向符将这些数据转向给某个命令。Here文件的这种功能对于某些命令的自动执行起着非常重要的作用。
通常将数据用一个特殊的字符串(分界符)“括“起来,命令执行时,Shell从程序段中读取所需的值。例如vi编辑一个文本进行某些替换工作,可以建立Here文件的方式由程序自动完成。
Vi myfile<
:g/teacher/s//student/g
END
其中,输入行“:g/teacher/s//student/g和:x被分解符“END”括住,执行时,输入行被逐个转向给vi命令,直到又遇到一个分解符”END”才结束。从而自动完成操作。分解符可自由定义,可以是一个字符或字符串,经常用的有!和END。
某些数值计算expr不能胜任时,可以调用unix的计算器bc:
b=324000.33
sum=`bc<
$b+145.66
END`
十三、awk的使用
1、awk的语法:
awk [ -F re] [parameter...] ['prog'] [-f progfile][in_file...]
2、awk使用举例
例1:显示文本文件testfile中第七行到第十五行中以字符“|”分隔的第一字段,第三字段和第七字段:
awk -F “|” ‘NR==7,NR==15 {printf $1 $3 $7}’
例2:显示文本文件test匹配(含有)字符串”2222″的所有行。
$awk ‘/2222/{print} ‘ test
例3:作为一个较为实际的例子,我们假设要对UNIX中的用户进行安全性检查,方法是考察/etc下的passwd文件,检查其中的passwd字段(第二字段)是否为”*”,如不为”*”,则表示该用户没有设置密码,显示出这些用户名(第一字段)。我们可以用如下语句实现:
#awk -F : ‘$2==”" {printf(”%s no password!\n”,$1′ /etc/passwd
十四、shell编程常用命令补充
1、cut命令
Cut命令将输入行的部分内容拷贝到输出。例如:
Cut -f 2 -d “|” test 输出文件test的第二个字段,以“|”分隔
Cut -c 2-5 test 输出文件test的每行第2至5个字符
2、 反引号” `”操作符。将命令的标准输出赋值给变量。如:
sum=`bc<
$b+145.66
END`
3、 cat命令
合并文件:
显示文件内容。应用举例:
合并文件:
Cat test1 test2 >test3
统计一组文件的行数、字数、字符数、字节数
Cat test*|wc –lwm
(统计一变量的行数、字数、字符数、字节数
Echo $a|wc –lwm)
4、 paste命令
粘贴文件。例如
Paste test1 test2> test3
5、 关于注释
#
收藏着,以便平时参考
第一章:概述
一、 shell 概念
shell 是unix操作系统提供的命令解释器,是用户与操作系统之间的接口。当你注册到unix系统的任何一个用户,系统都会为你启动一个shell,shell会一直等待你的指令,当你输入的命令被确认后,shell便对其进行解释并产生系统调用,完成相应的操作。然后,又进入等待状态。
换句话说,当你一登录到unix系统,就开始了与shell的对话。在此期间,你不断与shell交互,不断地对shell发出命令来指挥系统完成各种工作直到你退出系统。
事实上unix提供了三种shell,分别是Bourne Shell、C-Shell、Korn Shell。这三种Shell大体相同,只在某些地方有所区别。其中Bourne Shell在各种不同的UNIX版本中都是一致的,所以也叫标准Shell。而其它几种Shell不能简称,必须全称,这是为了不必要的混淆。对于每一个用户来讲,执行一个程序只能选择其中一种Shell,一般是Bourne Shell。当然也可以使用其他Shell,这需要在建立用户的时候指明,或在具体执行某一程序时特殊指定你所选择的命令解释器。下面将要介绍的内容如非特别声明都是针对Bourne
Shell的。
二、 Shell的特点和优点
1、 输入/输出的重定向可以很轻易的改变输入输出的来源和目的地。
2、 连接管道可以将一命令的输出作为另一命令的输入。
3、 可将Shell命令键入一个文件,通过执行这个文件来达到执行若干命令的目的。
4、 在不中断前台的操作的情况下,可通过后台方式运行其他命令。
5、 可以把系统命令、Shell命令进行适当的组合,构成一个新命令。
6、 可以执行多种命令,包括Shell内部命令、UNIX系统命令、编译好的可执行文件、甚至是Shell 传递的位置参数。
三、 一个简单的Shell程序
vi test
pwd
cal
在命令行“#”后键入sh test并回车,其结果为:先显示当前路径,然
后再显示日历。这个test就是Shell程序,当然是一个简单的Shell程序,
它只有两行:一行是pwd,另一行是cal.
第二章:Shell基础知识
一、 特殊符号
在Shell中有一些符号具有特殊的含义,可以用来实现某些功能,现叙述如下:
1、 星号(*):可以匹配任何字符串,包括空串。如:echo * 命令将显示当前目录下的所有文件和目录名,lf aa* 将显示所有以aa开头的文件名。使用 * 做匹配符时,应特别小心,如rm * 将删除目录下的所有文件。
2、 问号(?):可以匹配文件名中的任何单个字符。如用lf a??d 命令来显示当前目录下的文件时,其结果可能为:abcd、aacd、aaad等。
3、 中括号([]):可以匹配一个集合的元素。如果[crf]作为一个文件名模式的一部分,Shell将可以查到指定位置的字母为c、r或f的文件名。例如:lf [crf]at 命令的结果可能为:cat、fat、rat等。
中括号也能用于指定的一个字符域,无论是数字还是字母。如:lf chapter[1-9] 其结果将是可能存在的chapter1,chapter2…等文件名。
4、 后台执行符号(&):如果一个程序运行的时间很长,并且不是一个交互式
程序的话,就可以用 & 号使程序以后台的形式执行。其格式为:command &。
5、 分号(;):可以让你在一个命令行或程序的一行中执行多个命令。例如:
#cd;pwd。
6、 反斜杠(\):用于取消特殊字符的特殊含义。例如:lf aa\* 命令将查找
当前目录是否有名为aa*的文件,与lf aa* 命令的含义截然不同。
7、 单引号(‘ ’):取消除单引号以外的任何字符的特殊含义。例如:echo
‘my name is $name’其结果为:my name is $name,此时$只作为一个普
通字符使用了。
8、 双引号(“ ” ):取消除双引号、$号以及_号以外的所有字符的特殊含
义。单引号更加具有强制性。
9、 输入转向符(<):用于指定输入的设备或文件。如:mail root
则将文件message的内容发送给root。
10、输出转向符(>):用于将输出发送到指定的设备或文件中。如:lf>myfile
其结果是将lf的执行结果放到文件myfile中(同时清空文件中原有的数
据),而不显示到屏幕上。又如:将错误输出到重定向到空设备 2>/dev/null。
11、追加符号(>>):用于将命令的输出追加到某个文件中。如:lf >>myfile
其结果是将lf的执行结果追加到文件myfile中(文件原有的数据予以保
留),而不显示到屏幕上。
12、管道符号(|):可以将一个命令的输出作为另一个命令的输入,而不需建
立临时文件,以这样的方式建立的多命令行称为管道线。如:ls|more
将ls 的结果传递给more,由more来分屏显示。
13、改向符号(<<):常用于建立一个here文件。
14、&&和||:其作用是使命令有条件的执行。如:
command1 && command2:当且仅当command1执行成功后才执行command2
command1 || command2:当且仅当command1执行失败后才执行command2
二、 变量
Shell的变量不分类型,或者说只有字符串型变量,所以要使用数值运算则必须靠外部命令达到目的。而其变量种类有以下几种:
1、 用户自定义变量
在Shell中,这是最常用的变量,在程序中变量不需要事先说明,没有类型之分,也没有全程、局部的区别。变量可以随时随地定义,其名称是以字母开头的不包括空白字元的任何字符串,长度不限。其使用范围只限于程序运行期间,程序执行完毕,该变量即不复存在。
定义变量的格式: 变量名=字符串 (例:name=Tom)
其中,字符串可以是空串,表示变量被赋予空值。
引用一个变量时,在变量前加一$号即可。
Name=Tom (变量name被赋予字符串值Tom)
echo $name (显示变量name的值)
执行结果为:Tom
2、 系统变量(环境变量)
和自定义变量相似,系统变量只不过是在用户注册到系统的时候,由
系统自动赋值的,并且它的值会自动传递到各层Shell并能够被其所执行的
程序所调用。除非在程序中对环境变量进行修改,否则其值不会随Shell
程序的运行而改变,要将一个用户自定义变量设定为环境变量,只需用
export命令声名即可,例如:
name=Tom
export name
以下是用户一进入系统之后就已设定好的环境变量:
$HOME:用户自己的主目录
$PATH:执行命令时所搜寻的目录
$TZ :时区
$PS1 :命令行上的提示符
$PS2 :当命令尚未书完时,Shell要求继续输入时的提示符
3、 特殊变量
有些变量一开始执行Shell程序时就被自动设定的,一般不能进行修改,以下是一些特殊变量:
$0 Shell程序的执行名
$n Shell程序(或过程)的第n个位置参数值,n=1..9
$* Shell程序所有位置参数组成的字符串
$# Shell程序的位置参数的个数
$$ 程序执行后的进程号
$! 最后一个后台指令(程序)执行后的进程号
$? 命令执行后的返回值,返回0表示成功,返回1表示失败
其中,$n又叫位置变量,它是调用(运行)一个Shell程序时,跟在程序名后面的各个参数,最多可以有10个,例如:
#sh myprogram 15 20
则在程序中$1=15,$2=20
当你执行Shell时,如果参数的数目超过9个时,可以使用Shift命令将参数向前移动一格,如此便可以使用超过9个的参数。
三、 输入输出语句
1、 read 语句
read语句用于从键盘接收一个或多个值并把它们赋予相应的变量。
用法:read 变量名1 [变量名2,变量名3...]
例如:read a b
echo $a
echo $b
运行并输入 aaa bbb 回车后将显示:
aaa
bbb
需要注意的是,如一次需输入多个值,每个值之间要以空格来分隔,全
输入后再打回车确认。
如输入的字段值个数少于语句中变量的个数时,多出的变量将赋予空值。
如输入的字段值个数多于语句的变量个数时,多出的参数值被丢弃。
通常使用的方式是一次读入一个数据 ,即read 后只跟一个变量。
2、 echo 语句
echo 语句用于向标准输出设备输出字符串或变量的值。
用法:echo 字符串 或 echo 变量名1[变量名2,变量名3...]
例如:echo I am a student
echo 语句中还可以用一些控制字符对格式进行控制,常用如下:
\b 空一格,是显示行首为一个空格
\c 显示后不换行,下次显示时紧跟其后显示
\f 先清屏后在屏幕顶端显示
\n 换行,显示后多增加一空行
\r 回车
\t 显示时增加一个制表符
\v 垂直制表符
\\ 显示一个反斜杠
四、 赋值语句
1、 字符串:是最常用的赋值方法,等号后面跟一个后多个字符串。
如:name=John
name=”John Tom”
2、 read 语句:把键盘输入的值赋予变量。
如:read key (从键盘接收一个值并将其赋予变量key)
3、 用命令的结果赋值:通过反单引号把某个命令的输出赋予变量。
如:name=`pwd`
4、 用位置变量赋值:把命令行上的某一参数的值赋予变量。
如:name=$2 (把第二个位置参数的值赋予变量name)
五、 执行命令
在Shell中执行一个命令有五种方法,具体如下叙述:
1、 直接执行命令
在程序中通过调用命令名直接运行系统命令,如:lf 这种方式和在命令
中直接下命令的效果一样,也是最常用的执行方式。
2、 使用sh命令
在程序中通过sh command的形式运行其它Shell程序。这种方式除了这
个程序可不具有执行权限外和直接执行命令的形式一样。
3、 使用”.”命令
在程序中以 .command的形式运行命令(程序)。这时和使用sh命令相似,
只不过它不像sh一样会产生新的进程,相反,它会在原有的进程下完成。
4、 使用exec命令
在程序中以exec command的形式运行命令(程序)。此时这个Shell程
序将会被所执行的命令所取代。当这个命令执行完毕之后,这个Shell程序
也会随之结束。
六、 流程控制
1、 for 语句
for语句是一个循环语句,其循环的次数由实参表中的参数个数决定,每
次循环都执行一遍关键字do和done之间的语句。
语法为: 流程图如下:
| 没有了
for 变量名 in 实参表 |—-<实参中还有东西吗?>—|
do | |有 |
命令序列 | 从实参表中取得一 |
done | 项放到变量中 |
| | |
| 执行命令序列 |
| | |——–|
|———–| |
例题1: |
for a in xx yy zz
do
echo $a
done
结果如下:
xx (第一个循环变量a被赋值xx,由echo $a将其值显示出xx)
yy (第一个循环变量a被赋值yy,由echo $a将其值显示出yy)
xx (第一个循环变量a被赋值zz,由echo $a将其值显示出zz)
当实参表中没有可用赋值的参数时,循环就结束了。
例题2:将当前目录下的文件名都加上一个后缀.txt
for file in `lf`
do
mv $file $file.txt
done
2、 while 语句
while 语句也是一个循环语句,它的循环次数由测试语句的返回值来决
定,除非返回值为假,否则while语句将一便又一便地反复执行关键字do
和done之间的语句。
语法: 流程图
| 假
while [ 判断语句 ] |———<判断语句> ———|
do | |真 |
命令序列 |—————| |
done |
|—————-|
|
例题:
number=0
while [ $number –lt 10 ]
do
echo “$number\c”
number=`expr $number + 1`
done
结果:0123456789
3、 if 语句
if 是非循环语句,但也不是严格意义上的顺序执行语句,它对状态进行
判断,当且仅当测试语句的返回值为真时才执行关键字then后面的语句。
语法: 流程图
| 假
if [ 判断语句 ] <判断语句>——|
then |真 |
命令序列 命令序列 |
fi |————-|
|
例题:文件名为chk
if [ $# != 0 ]
then
echo “Arg1:$1”
fi
执行 chk Hello
结果: Arg1:Hello
4、 if then else 语句
是 if 语句的加强,此语句当且仅当测试语句的返回值为真时去执行关
键字then后面的命令,否则便执行关键字else后面的命令。
语法: 流程图
| 假
if [ 判断语句 ] <判断语句>——|
then |真 |
命令序列1 命令序列1 命令序列2
else | |
命令序列2 |————|
fi
例题:if [ $a –le 10 ]
then
echo”little”
else
echo “large”
fi
5、 if then elif 语句
是if语句的嵌套形式,即一个if语句中再嵌套另一个if语句。
语法: 流程图
| 假
if [ 判断语句1 ] <判断语句1>——|
then |真 | 假
命令序列1 命令序列1 <判断语句2>——|
elif [ 判断语句 ] | |真 |
then | 命令序列2 命令序列 3
命令序列 2 |————-|—————-|
else |
命令序列3
fi
例题:输入三个数,显示它们的相等情况
read word1 word2 word3
if [ $word1=$word2 –a $word2=$word3 ]
then
echo “word1=word2=word3”
elif [ $word1=$word2 ]
then
echo “word1=word2”
elif [ $word1=$word3 ]
then
echo “word1=word3”
elif [ $word2=$word3 ]
then
echo “word2=word3”
else
echo “No match”
fi
6、 case 语句
case语句经常用于多重选择,它允许你选择几个模式之一,然后执行哪
个模式的命令序列,其中关键字case和esac必须成对使用,每个模式最后
必须是;;
语法:
语法: 流程图
| 真
case 变量名 in ——命令序列1——|
pat1) 命令序列1;; |假 真 |
pat2) 命令序列2;; ——命令序列2——|
pat3) 命令序列3;; |假 真 |
esac ——命令序列3——|
|假 |
|———————————-|
其中pat字段除了可以指定一些确定的字串,也可以指定字符串的集合:
* 任意字串
? 任意字元
[abc] a,b,或c三字元之一
[a-n] 从a到n的任一字元
| 多重选择
例题:
echo ‘Enter A,B,or C:\c’
read letter
case $letter in
A|a) echo ‘You entered A.’;;
B|b) echo ‘You entered B.’;;
C|c) echo ‘You entered C.’;;
*) echo ‘Not A,B,or C.’ ;;
esac
7、 continue 和 break 语句
这两者都用于for、while以及until循环语句。其中,break执行后将
跳转到done后面执行(也即跳出循环),而continue会跳到do后面,继续
执行下一个循环。
Continue语句跳过循环体中该语句之后的语句,直接进行下一个循环。
例如:
a=0
while [ $a –le 4 ]
do
a=`expr $a + 1`
if [ $a –le 2 ]
then
echo “little”
continue
fi
echo “large”
done
执行结果:little(显示little后continue忽略以后的语句,进入下一循环)
little(显示little后continue忽略以后的语句,进入下一循环)
large
large
break语句直接跳出循环,而不管循环是否正常结束,通常用于无条件循环语句。
例如:a=0
while [ $a –le 5 ]
do
a=`expr $a + 1`
if [ $a –ge 3 ]
then
break
fi
echo “little”
done
echo “end”
执行结果:little
little
end
七、 过程
所谓过程,就是一段Shell程序。当一个程序达到一定长度的时候,程序
的调试和阅读就变的比较困难,通常要将程序划分成若干段落,把完成同一主
题的若干语句组织到一起,就是一个过程。
格式: 过程名()
{
命令序列
}
例如:
menu()
{
clear
echo “\n\n\t\t 1) 关闭系统“
echo “\n\n\t\t 2) 强行关闭“
echo “\n\n\t\t 3) 重新测试“
echo “\n\n\t\t 请输入选择:\c”
}
此过程的过程名叫menu,过程体中首先进行清屏,然后显示了一个简单的菜单。过程对于需要经常重复执行的一组命令非常有用,将这组命令放入一个过程中,以后当需要执行的时候只要调用这个过程名即可。
在过程中的语句可以通过参数传递接收过程外部的变量值,方法如下:
1、 直接使用外部定义的变量。
如:a=10
Check()
{
. . . .
sum=`expr $a + 5`
. . . .
}
2、 使用位置参数
如:Check()
{
echo $1
}
则在程序中以如下方式调用:Check hello
执行时过程中的显示语句回将hello显示出来。
在Shell程序中执行每一个命令都会有一个返回值,过程也不例外,你可以根据情况用return命令来定义这个值。
例如:Check()
{
if [ $sum –eq 100 ]
then
returnno=0
else
returnno=9
fi
return $returnno
}
check
echo $?
执行结果为:9
这样做的好处是可以根据过程的返回值知道过程执行的情况如何,但要注意,return语句所能返回的只能是数字,有字母组成的字符串将被视为非法。
过程的定义不分先后,可随时随地定义,一经定义就可使用。但过程定义后必须调用才可起作用,不经调用等于每定义。
在编写一个Shell程序时,尽量使用过程是一个好的习惯。这样会使程序变的容易阅读,结构功能一目了然。最好是把所有语句都分别包含在各个过程中,最后在定义一个主过程,用来调用其它子过程。如:
Ready()
{ . . . . . . }
Getsh()
{ . . . . . . }
Trans()
{ . . . . . . }
Loads()
{ . . . . . . }
main()
{
Ready
Getsh
Trans
Loads
}
main
八、 expr 命令
Shell提供expr命令来完成算术运算。
命令格式:expr expression
例如:number=`expr $number + 1`
通常expr命令只将运算结果输出到标准输出上,如果要将结果赋给某个
变量,就要用到命令替换的方式。上面的例子是将number变量的值加1后再赋
给number变量。
Expression是由字符串以及运算符组成,每个字符串或是运算符之间必
须用空白隔开。否则expr不会计算表达式,而是直接将表达式输出。下面是运
算符的种类及功能,而优先级则以先后次序排列,我们可以用小括号来改变运
算符的优先次序。
1) * 乘法 8)= 等于
2) / 除法 9)!= 不等于
3) % 取余数 10)>= 大于等于
4) + 加法 11) > 大于
5) – 减法 12) & AND运算
6) < 小于 13) | OR运算
7) <= 小于等于
当expression中含有”*”,”(“,”)”等符号时,必须在其前面加上“\”以取消它的特殊含义,以免被Shell解释错误。
例如:a=`expr 2 * ( 3 + 4 )` 是错误的
正确的方法应为:a=`expr 2 \* \( 3 + 4 \)`
而b=`expr 1.2 + 1` 也是错误的,因为expr只能处理整数运算。
此外,利用expr命令还可以完成获得字符串长度的功能。
例如:cxsh=”0000135”
l=`expr length “$cxsh”`
执行后的结果为:7
九、 条件测试语句
Shell提供测试语句来测试各种条件(通常用于控制语句中)。测试语句
以中括号[]括住测试条件,中括号前后需留有空格,几种测试条件如下:
1、 字符串测试:用于测试两个字符串是否相等。
[ string1 = string2 ] 字符串string1和string2是否相等
[ $name =’Johne’ ] 变量name的值是否为字符串John
[ $name = $string ] 变量name的值是否等于变量string的值
[ $string ] 变量string的值是否为空
[ -z string ] string的长度是否为0
[ -n string ] string的长度是否不为0
[ “string” ] string的长度是否为0
[ string1!=string2 ] 字符串string1和string2是否不相等
[ $name!=’Jone’ ] 变量name的值是否不等于字符串Jone
[ $name!=$string ] 变量name的值是否不等于变量string的值
[ !”string” ] 变量string的值是否不为空
例如:if [ “$name” ]
then
echo “name:not empty”
else
echo “name:empty”
fi
2、 文件测试:用于测试文件的各种属性。
[ -f $file ] 名为$file的文件是否存在
[ -r $file ] 名为$file的文件是否存在并可读
[ -w $file ] 名为$file的文件是否存在并可写
[ -x $file ] 名为$file的文件是否存在并可执行
[ -s $file ] 名为$file的文件是否存且大小不为0
[ -d $file ] 名为$file的目录是否存在
以上测试条件中,文件名可以是字符串也可以是变量。
在判断条件之间加!号,其意义与以上相反,如:
[ ! -f $file ] 以变量$file的值为名的文件是否不存在。
[ ! -r /unix ] 名为unix的文件是否不存在或不可读。
举例:if [ -f /tmp/test ]
then
echo “file /tmp/test:exist”
else
ehco “file /tmp/test:not exist”
fi
3、 数值测试:若字符串由数字组成,则可进行数值测试。
[ string1 -eq string2 ] 数字string1是否等于数字string2
[ string1 -ne string2 ] 数字string1是否不等于数字string2
[ string1 -lt string2 ] 数字string1是否小于数字string2
[ string1 -le string2 ] 数字string1是否小于等于数字string2
[ string1 -gt string2 ] 数字string1是否大于数字string2
[ string1 -ge string2 ] 数字string1是否大于等于数字string2
其中,string1和string2可以是数字值或为数字的变量。
例如:if [ $No1 -eq $No2 ]
then
echo “$No1 equal $No2”
else
echo “$No1 not equal $No2”
fi
以上三种测试返回0时为真,非0值为假。此外在测试条件中,还可以配合逻辑运算符作各种情况的测试,Shell提供下列逻辑运算符:
-a 或 and 逻辑与,即几个条件同时成立其结果才为真
-o 或 or 逻辑或,即几个条件中只要有一个成立结果就为真
! 或 not 逻辑非,取条件的反值
如:[ -f file1 –a –r file2 ]
表示当文件file1存在并且文件file2存在且可读的情况下,返回值才为真。
十、 trap 命令
trap命令的作用主要是信号拦截,根据使用方式,可分为以下几种:
1、来关闭一个信号(使这个信号被忽略)。
2、重新定义这个信号的动作。
3、恢复原有的缺省动作。
信号的概念:指由系统(核心)、程序或kill命令发出的,旨在通知执行程序某件事的发生,并使程序完成相应信号所对应的动作。UNIX操作系统定义了若干信号,分别对应于一个数字。其中较为常用的信号如下:
0: 退出Shell时产生,即按Ctrl-D.
1: 挂断,终端被切断时,核心将此信号发送到该终端控制的进程。
2: 中断,按Delete,Ctrl-Break,Ctrl-C时产生。
3: Quit, 控制终端的停止键被按下(Ctrl-\)。
9: 删除一个或一组进程。
15: 软件结束(中断)信号。通常由kill命令传出。
使用方法:
忽略信号的命令格式为: trap “” 信号序列
重新定义信号动作的命令格式为: trap 命令序列 信号序列
恢复信号原有缺省动作的格式为: trap 信号序列
其中,命令序列可以是一个或若干个命令甚至函数,不能为空。
如:’clear;exit’
信号序列是由一个或若干个中断号组成,中断号之间以空格分开。
如:1 2 3 5
先将trap三种格式的使用方法和结果分述如下:
1、 trap “” 信号序列:在程序头加上次种格式的trap命令,将
使程序忽略程序执行中收到的信号序列中的信号,它使系统中定义的该信号
对应的动作变为空。
2、 trap 命令序列 信号序列:在程序头使用此种格式的trap命令,
将使程序在接收到的信号序列中的信号时,去执行命令序列中的命令,它使
系统中定义的该信号对应的动作改变为命令序列中的命令。
3、 trap 信号序列:此种格式将恢复系统定义的信号序列中各信号
所对应的缺省动作值,也就是将1、2两种命令设定的动作改回缺省值。
Trap 命令经常用于程序被中断时删除临时文件。
如:trap ‘rm /tmp/linshifile;clear;exit’ 2
如希望程序在执行时不被“骚扰”,则可用:trap “” 命令序列
如:trap “” 1 2 3 15
则系统或者其它用户kill命令发出的1、2、3、15等信号将无法中
断该程序的执行,但信号9将无法拦截。
十一、Here 文件
Here文件实质上是一种重定向的应用。它允许你将一小段数据放在Shell文件中,通过转向符将这些数据转向给某个命令。Here文件的这种功能对于某些命令的自动执行起着非常重要的作用。
通常将数据用一个特殊的字符串(分界符)“括“起来,命令执行时,Shell从程序段中读取所需的值。例如vi编辑一个文本进行某些替换工作,可以建立Here文件的方式由程序自动完成。
Vi myfile<
:g/teacher/s//student/g
END
其中,输入行“:g/teacher/s//student/g和:x被分解符“END”括住,执行时,输入行被逐个转向给vi命令,直到又遇到一个分解符”END”才结束。从而自动完成操作。分解符可自由定义,可以是一个字符或字符串,经常用的有!和END。
某些数值计算expr不能胜任时,可以调用unix的计算器bc:
b=324000.33
sum=`bc<
$b+145.66
END`
十三、awk的使用
1、awk的语法:
awk [ -F re] [parameter...] ['prog'] [-f progfile][in_file...]
2、awk使用举例
例1:显示文本文件testfile中第七行到第十五行中以字符“|”分隔的第一字段,第三字段和第七字段:
awk -F “|” ‘NR==7,NR==15 {printf $1 $3 $7}’
例2:显示文本文件test匹配(含有)字符串”2222″的所有行。
$awk ‘/2222/{print} ‘ test
例3:作为一个较为实际的例子,我们假设要对UNIX中的用户进行安全性检查,方法是考察/etc下的passwd文件,检查其中的passwd字段(第二字段)是否为”*”,如不为”*”,则表示该用户没有设置密码,显示出这些用户名(第一字段)。我们可以用如下语句实现:
#awk -F : ‘$2==”" {printf(”%s no password!\n”,$1′ /etc/passwd
十四、shell编程常用命令补充
1、cut命令
Cut命令将输入行的部分内容拷贝到输出。例如:
Cut -f 2 -d “|” test 输出文件test的第二个字段,以“|”分隔
Cut -c 2-5 test 输出文件test的每行第2至5个字符
2、 反引号” `”操作符。将命令的标准输出赋值给变量。如:
sum=`bc<
$b+145.66
END`
3、 cat命令
合并文件:
显示文件内容。应用举例:
合并文件:
Cat test1 test2 >test3
统计一组文件的行数、字数、字符数、字节数
Cat test*|wc –lwm
(统计一变量的行数、字数、字符数、字节数
Echo $a|wc –lwm)
4、 paste命令
粘贴文件。例如
Paste test1 test2> test3
5、 关于注释
#
相关文章推荐
- shell编程基础(2)---&&与||
- 精讲shell基础以及如何高效的学习shell编程
- Shell编程基础---逻辑判断、if/case语法
- shell编程基础(三)——shell变量
- shell编程基础(六)——shell函数
- Shell编程基础
- 第17篇 shell编程基础(2)
- linux基础之shell编程(2)-条件判断,算数运算,测试
- Shell编程基础(转)
- Linux-shell编程基础-变量
- Shell编程基础
- shell编程基础
- Shell编程基础 Ubuntu
- Shell编程基础
- linux下Shell编程基础
- Shell编程基础
- Shell编程基础(1)
- shell编程基础
- shell编程之基础
- Shell编程基础(5.6)