shell编程基础练习

shell作为一个人机交互的接口,在Linux中发挥着很大的作用,而shell编程则是减轻系统工程师工作的利器,这里总结一下shell编程的主要内容(趁着程序运行的空档).

本文的基本结构是shell编程的基本命令和常用的实例。

命令篇

环境变量

环境变量指的是当shell运行后,系统默认给shell传递的变量。

$pwd:显示当前路径    
$HOME:当前用户的主目录
$#:shell中参数的个数
$0:shell文件名
$1-$n:参数值
具体还有部分预设参数列表,见(此链接)[http://www.cnblogs.com/fhefh/archive/2011/04/15/2017613.html]。

文件和目录操作

文件操作的主要命令有:

cd:切换目录
ls:列出目录下文件 通常含有 -a(隐藏文件) -l(文件权限)
mkdir,rmdir:创建,删除目录
cp,mv,rm:拷贝,移动,删除文件或者目录(rm在删除目录时需要加-rf)
ln:建立硬链接(ln -s可以建立符号链接)
chmod:改变文件权限
//chmod 对文件权限的改变方式有两种:符号方法和八进制方法
//所谓符号方法就是采用(who)(action)(permissions)来描述对对权限的操作
//这里who的选择有:u g o a,分别表示属主,组,其他和所有用户
//这里action的选择有:+ - =,分别表示增加,减少和设定文件权限。
//这里permision的选择有:r w x t s,分别表示读,写,执行,粘滞位和SGID位
//所以给个例子 chmod a+x hello.c 意思就是对hello文件的所有人增加执行权限
//而所谓八进制的方法则是对每种权限用一个数字进行表示,读4写2执行1,对所有用户生效。
//同样举个例子 chmod 777 hello.c 意思是任何人可以进行任何操作
chown:改变文件的属主 -R(递归改变该文件夹内多有文件的属主)
//这里给出用法 chown *user:group files*
chgrp:改变文件所属的组 同样可以使用上述的-R
//这里给出用户 chgrp *group files*

输入输出和进程操作

输入输出是使用命令过程中放入和产生的数据,对文件的输出可以使用最简单的echo和printf来进行,但是这两个命令只能将文件输出到终端上,为了保留我们想要的数据,需要将数据存储进文件的时候,就需要用重定向命令了,重定向命令很简单,按照cmd > files 即可,但是这会让每次重定向时将原来的数据冲掉,所以可以使用 cmd >> files命令在文件尾部进行追加。

同时,对输入输出的描述还可以使用0,1,2进行简化描述,其中0代表标准输入STDIN,1表示标准输出STDOUT,2表示标准错误STDERR,因此在操作时可以利用0 1 2 进行简化表示。

另外,还需要注意的是命令的输出可以作为另一个命令的输入,采用|管道命令实现。这是因为每个命令都是一个进程在运行,而使用管道后,其实后一个命令是前一个进程的子进程,这样管道实际上起着进程通信中的管道的作用。将父进程的输出系统传递给子进程。

对于进程来说,可以分为前台进程和后台进程。很显然,当一个shell在运行前台进程时你是不可以输入的,而将进程放入后台去运行,你则可以在shell中继续干及自己的事情。前面说到了,一条ls命令什么的就是一个前台进程,而后台进程的实现可以在运行命令的末尾加上&来实现,比如说

ls -n &

这时,shell就会给你返回一条信息, [1] 620类似的,其中的框着的数字就代表是任务标志符,620代表进程标志符。

这样就涉及到了另外一个问题,那就是前台进程和后台进程之间的切换,这里的切换操作之前可以列出当前的后台任务数,使用命令:

jobs

接着,可以使用两个简单的命令bg和fg,这两个命令的使用都是 cmd + 一个任务标志,如

bg %1
fg %2

等等。再者,如果你想等待后台的某个任务结束,可以使用wait命令,使用的格式同上,只是在wait过程中你是不能输入的。

最后关于进程操作还有一个重要的命令就是ps命令了,ps命令可以显示出所有正在运行的进程,但是通常情况下,我们都是用grep命令结合管道过滤出我们想要的进程,通常ps的属性项为-aux,即

ps -aux
//这里a代表终端中的所有进程 x非终端上的进程 u以用户为主的形式显示程序情况
当然最后还有进程的杀死命令了,kill,用法很简单,参照bg命令。

流控制 循环和函数

shell中仍然存在高级语言中的选择和循环结构,下面主要介绍if和while语句。
if语句的主要格式为

if ...; then
    do sth,
else
    do sth,
fi

case语句也比较常用,主要格式为:

case keyword in 
    pattern1)
        sth.
        ;;
    pattern2)
        sth.
        ;;
    patterN)
        sth.
        ;;
esac

while语句的主要格式为:

while cmd
do 
    sth.
done

for循环的主要格式为:

for name in word1 word2 ... wordN
do 
    sth.
done

具体的语句需要在实践中多多使用就可以啦,下面在来说一下函数的简单用法。使用函数之前需要先定义函数,函数的定义方法为:

function ()
{
    sth, 
}

这样,在之后的shell脚本中就可以使用函数了,使用函数的方法为函数名加变量,如function 10 20 30,这样在函数的定义中你就可以使用$1,$2,$3来使用上述的三个变量了。

文本过滤和处理

这才是这篇文章的重点呀,文本过滤和处理应该是shell中最常用到的功能了,下来主要说三个博大精深的命令:grep,sed,awk。

grep命令常用于查找文件中的字符串,其常见的用法为:

grep word file 
//从文件file中查找出包含word的行
//grep的几个参数有
//-v 后接需要忽略的word 
//-i 搜索时大小写无光
//-I 仅仅列出file中包含word的文件名

sed命令后接正则表达式进行文件的过滤,常见的用法有:

sed 'script' files
//script可以用来进行打印,删除和替换等操作。
//当使用打印命令时的格式为:'/正则/p'
//当使用

其他命令

列表如下吧~

head
指的是取出文件头部的行 可以使用-number来进行具体指定
例子: head -5
tail
和head的用法类似,指的是取出文件尾部的行,同样使用-number具体指定
tr
对文件中的符号进行替换
sort
对文件内容进行排序,常见的用法有-n(按照数字进行排序) -r(按照逆序进行排列)
uniq
将文件中的重复行剔除掉,保证行的唯一性,常见的参数有-c(列出此行出现的次数)
find
用于查找文件和目录,产用的参数有-name -type(文件类型) -size(文件的大小)
xarg
由于将之前管道中的参数传递进下一条命令中,常用的参数有-I{}(指明参数的代表符) -n(每次传递的个数) -P (使用的进程数) -p(给出用户交互,在执行一条命令之后,等待用户输入)
最近,发现xargs还有一个好的用法是将文件奇偶行分开,

cat file | xargs -n2

sleep
系统延时命令,常见的有sleep 1s,sleep 1m,sleep 1h。
type:
bc & expr
进行数学运算,二者的用法不一样,其中expr的用法为 expr a + b(需要注意的是expr后面的参数都需要加空格) bc的常见用法为 echo "a+b" | bc
wc
测试文件中的行数,单词数等。

posted @ 2014-10-22 16:19  nearmeng  阅读(365)  评论(0编辑  收藏  举报