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. 解决faststone capture在台式机上录制屏幕视频没有声音的问题

    点击屏幕录像机: 在弹出的屏幕录像机窗口中选择录制音频,然后点击选项按钮: 在弹出的选项按钮中选择视频选项,将所有的多选框都选中,注:最后一个选项录制windows XP的工具提示最好也选上,我发现如 ...

  2. Python Counter()计数工具

    Table of Contents 1. class collections.Counter([iterable-or-mapping]) 1.1. 例子 1.2. 使用实例 2. To Be Con ...

  3. iOS 开发之— NSURLProtocol

    最近在项目里由于电信那边发生dns发生域名劫持,因此需要手动将URL请求的域名重定向到指定的IP地址,但是由于请求可能是通过NSURLConnection,NSURLSession或者AFNetwor ...

  4. Tfs服务器迁移(更改IP)后客户端(vs2013)配置方法

    一.前言 公司开发项目需要进驻客户现场,局域网中的tfs代码服务器有时会有修改ip的情况发生.服务器ip修改后在vs2013中更改服务器ip地址非常麻烦,有些时候需要将代码重新进行映射.多次试验后将可 ...

  5. JavaFX前言

    笔者在一家互联网公司做JavaEE开发,公司开发了移动端的产品,唯独没有PC端的产品,于是领导将任务分配给笔者. 使用Java开发PC客户端,我的第一反应是使用swing API.但是,产品的需求是客 ...

  6. 批量更新memcached缓存

    假如系统里有3类数据company,user,product 利用维护版本号version的方式达到批量更新缓存的效果 memcache.Add("company",cversio ...

  7. 【Android Api 翻译1】Android Texting(2)Testing Fundamentals 测试基础篇

    Testing Fundamentals The Android testing framework, an integral part of the development environment, ...

  8. Gradle实战:不同编译类型的包同设备共存

    查看原文:http://blog.csdn.net/u010818425/article/details/52335844 Gradle实战系列文章: <Gradle基本知识点与常用配置> ...

  9. Java实现深克隆的两种方式

    序列化和依次克隆各个可变的引用类型都可以实现深克隆,但是序列化的效率并不理想 下面是两种实现深克隆的实例,并且测试类对两种方法进行了对比: 1.重写clone方法使用父类中的clone()方法实现深克 ...

  10. Java学习笔记——switch语句的参数类型

    在JDK1.6的版本中,switch后面的括号里面只能放int类型的值,注意是只能放int类型, 但是放byte,short,char类型的也可以. 是因为byte,short,shar可以自动提升( ...