您的位置:首页 > 运维架构 > Shell

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、 关于注释

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: