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

测试文件中的行数,单词数等。

shell编程基础练习的更多相关文章

  1. 【转】Shell编程基础篇-下

    [转]Shell编程基础篇-下 1.1 条件表达式 1.1.1 文件判断 常用文件测试操作符 常用文件测试操作符 说明 -d文件,d的全拼为directory 文件存在且为目录则为真,即测试表达式成立 ...

  2. 【转】Shell编程基础篇-上

    [转]Shell编程基础篇-上 1.1 前言 1.1.1 为什么学Shell Shell脚本语言是实现Linux/UNIX系统管理及自动化运维所必备的重要工具, Linux/UNIX系统的底层及基础应 ...

  3. shell编程基础(转载)

    Shell编程基础 原作者 Leal:请参阅页面底部的编者列表. 授权许可: 创作共享署名协议 GNU 自由文档许可证 注意:本文仍然在持续的修订之中,且错漏之处可能较多.如果能够阅读英语的话,可以考 ...

  4. 【Shell 编程基础第二部分】Shell里的流程控制、Shell里的函数及脚本调试方法!

    http://blog.csdn.net/xiaominghimi/article/details/7603003 本站文章均为李华明Himi原创,转载务必在明显处注明:转载自[黑米GameDev街区 ...

  5. Linux学习之二十一-shell编程基础

    Shell编程基础 Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁.Shell 既是一种命令语言,又是一种程序设计语言.Shell 是指一种应用程序,这个应用程序提供了一个 ...

  6. 7-1 shell编程基础之二

    shell编程基础之二 算数运算 bash中的算术运算:help let +, -, *, /, %取模(取余), **(乘方),乘法符号有些场景中需要转义 实现算术运算: (1) let var=算 ...

  7. 6-2 shell编程基础

    shell编程基础 编程基础 Linus:Talk is cheap, show me the code 程序和编程风格 程序: 程序:算法+数据结构 数据:是程序的核心 算法:处理数据的方式 数据结 ...

  8. shell编程基础进阶

    为什么学习shell编程 shell脚本语言是实现linux/unix 系统管理机自动化运维所必备的重要工具,linux/unix系统的底层及基础应用软件的核心大部分涉及shell脚本的内容.每一个合 ...

  9. 基于Linux系统的Shell编程-基础篇

    1. Shell基础介绍 1.1 Shell编程的意义 为什么使用shell编程 节约时间 1.2 显示脚本执行过程 前面有+表示执行过的命令的 前面没有东西,表示输出到屏幕上的内容. [root@C ...

  10. Shell 编程基础之变量和环境变量

    一.变量赋值和引用 Shell 编程中,使用变量无需事先声明,同时变量的命名不惜遵循如下规则: 首个字符必须为字母(a-z,A-Z)或者_ 变量名中间不能有空格,可以使用_连接 不能使用其他表达符号 ...

随机推荐

  1. 40 JavaScript Chart and Graph Libraries for Developers--reference

    reference:http://www.egrappler.com/javascript-chart-and-graph-libraries-for-developers/ BY TEAMEGRAP ...

  2. find your present (2)

    Problem Description In the new year party, everybody will get a "special present".Now it's ...

  3. 【开源项目5】测滑菜单MenuDrawer的使用以及解析

    在安卓中左右侧滑菜单的使用用的比ios多得多,可能是谷歌带的头吧,几乎所有的谷歌应用都有侧滑菜单.谷歌没有开放这个源码,在一个成熟的开源代码出现之前,大家都是各自为战,偶尔能看到一个勉强实现了的.Me ...

  4. Android学习笔记⑦——UI组件的学习AdapterView相关1

    AdapterView是一个非常重要的组件之一,他非常灵活,所以得好好学...AdapterView本身是一个抽象类,派生出来的子类用法也十分相似,只是界面有一定的区别,因此本节把他们归为一类 Ada ...

  5. Android 使用 HTTP 协议访问网络

    正在看<第一行代码>,记录一下使用 HTTP 协议访问网络的内容吧! 在Android发送Http请求有两种方式,HttpURLConnection和HttpClient. 1.使用Htt ...

  6. linux_cpu信息查询

    查看cpu信息: [root@css-management ~]# cat /proc/cpuinfo processor : 0vendor_id : GenuineIntelcpu family ...

  7. rpm build error: invalid predicate

    rpm build error error message:/usr/lib/rpm/find-debuginfo.sh /usr/src/redhat/BUILD/RPMS find: invali ...

  8. LeetCode 337

    House Robber III The thief has found himself a new place for his thievery again. There is only one e ...

  9. MongoDB - Introduction of the mongo Shell

    Introduction The mongo shell is an interactive JavaScript interface to MongoDB. You can use the mong ...

  10. HttpURLConnection&HttpClient网络通信

    一:HttpURLConnection简介: 用于发送或者接受HTTP协议请求的类,获得的数据可以是任意类型和长度,这个类可以用于发送和接收流数据,其长度事先不知道. 使用这个类遵循一下模式: 获得一 ...