Shell编程

标签: shell 编程 | 发表时间:2013-01-31 19:26 | 作者:@IT_Student
出处:http://www.cnblogs.com/

本来打算寒假回家好好学习Linux的,为以后学习嵌入式打好基础的!回家之后的学习效率非常低,之前为了搭建Linux环境,折腾了很长时间,学到现在也就勉强才把Shell编程学完了!今天就把自己学习的相关知识点总结整理一下!

个人感觉shell程序跟windows下的批处理文件有点像,就是将一些系统命令写进一个可执行文件中,然后执行。shell程序的语法跟C语言也很相似,所以有了C语言的基础,对shell程序的理解上有很大的帮助!

一.shell基础

1.shell是一个作为用户与linux系统之间接口的程序;

2.重定向输出

ls –l > lsoutput.txt     将ls -l输出的内容写到lsoutput.txt文件中。

ps >>lsoutput.txt      将输出的内容追加到lsoutput.txt文件的末尾

3.重定向输入

more <killout.txt 将killout.txt中的内容作为more命令的参数

4.管道:在linux下通过管道连接的进程可以同时进行,并且随着数据流在他们之间传递可以自动的协调。

ps | sort | > jingcheng.txt

5.运行shell程序有两种方式:

调用shell,将脚本文件名作为shell的参数; /bin/sh first.sh

将脚本文件设置为可执行; chmod +x first.sh first.sh

二.shell语法

1.变量

所有变量都是看做字符串并以字符串来存储,shell和一些工具程序会在需要的时候将字符串转化成相应的数值。Linux是一个区分大小写的系统。如果字符串里包含空格,就应该将其用引号括起来。*是字符串匹配字符,?是单个字符匹配字符。

var=hello world
echo $var hello
var=”hello world”
echo $var hello world
echo “$var” hello world
echo ‘$var’ var

2.环境变量

当一个shell程序开始执行时,一些变量会根据环境变量中的设置的值来进行初始化。主要的环境变量有

$PATH       以冒号隔开用来搜索命令的目录列表

$0             shell脚本的名字

$#            传递脚本参数个数

$$             shell 脚本的进程号,通常用他来生成临时文件 /tmp/tmpfile_$$

3.参数变量

如果脚本程序带有参数,一些额外的变量就回创建。即是没有传递任何参数,环境变量$#也依然存在,只不过值是0

$* 打印所有参数,并按照环境变量IFS第一个字符来分隔参数

$@ 将所有参数打印出来,并且不会挤在一起

$1,$2…分别代表第一个,第二个参数

 

set foo bar foo
echo “$@” foo bar foo
echo “$1” foo
echo “$2” bar

 

4.条件

 

if test –f fred.c if [ –f fred.c ]; then
then …
.. fi
fi

 

文件条件测试:

-f     文件是普通文件即为真

-d     文件是目录即为真

5.控制结构,这部分很好理解,类似与C语言中的语法

if语句

 

if condition
then
  statement
else
  statement
fi

 

elif语句相当于嵌套if语句,等价于else if

注意

if [$var =”yes”]; then 这里判断等于用=,不是C语言中的==,注意!!

$var”比$var更安全,因为万一$var 的值为空的话,在判断$var=”yes”是就会出现错误,加上引号就不会出现这种问题了。

for循环

 

for var in values  
do                                                            

done

 

 

for var in bar fud 43
do 
  echo $var
done

 

while循环

 

while condition do
statements
done

 

until 语句

 

until conditions 条件为假时执行
do
statements
done

 

case语句

 

case “$var” in 
 y) echo ”yes”;;
 yes) echo “yes”;;
 n) echo “no”;;
 no) echo “no”;; 
 *) echo ”please input again”
esac

 

case “$var” in 
  yes | y)  echo ”yes”;;
  no | n)   echo “no”;; 
  *)       echo  ”please input again”;;
esac 


有时候还会采取这样的 [Yy][Ee][Ss] 这样的形式来匹配6种可能的输入形式,保证输入任何形式都有相应的处理。

命令列表,有时候可能需要将几条命令连接成一个序列。

and列表 条件1&&条件2&&条件3…

or列表 条件1 || 条件2 || 条件3…

6.函数

函数定义和C语言的形式类似

函数调用直接用函数名,后面跟上参数,不需要用括号。

当一个函数被调用时,脚本程序的位置参数($*,$@,$#,$1,$2..)会被替换成函数的参数,当函数执行完之后就回还原原来的值。

 

name()
{
echo “you your name is $*” 这里就表明这个函数需要参数了
echo “your first name is $1”
echo “your last name is $2”
}
echo “please input your name”
read name
name “$name”
exit 0

 

三.命令

命令分为两种,一种是在命令提示符下执行的普通命令,成为外部命令;另一种是内部命令,在shell内部实现的,不能作为外部程序被调用。内部命令执行效率更高。

1.break命令,和C语言中一样,只跳出一层循环,这里不多讲了。

2.:命令,相当与一个空命令,可以看作是true,但是执行比true快。

3.continue命令,跳到下一次循环继续执行,也和C语言中一样。

4.echo命令,可以使用echo –n 来清除最后的换行符。

5.eval命令

 

foo =10
x=foo
y=’$’$x
echo $y

 

这里输出的是 $foo,如果将 y=‘$’$x 换成 eval y=’$’$x,输出的是10,eval的命令就相当于额外的一个$,他给出一个变量值的值。

6.exit n 使脚本程序以退出码n退出程序,0表示成功退出,1~125表示错误退出,其他退出码有特殊含义。

7.export命令 export命令将自己的参数创建为一个环境变量,而这个环境变量可以被当前程序调用的其他脚本和程序看见。

export PATH =/bin:$PATH

8.expr命令将他的参数当作一个表达式来求值

x=`expr $x+1`这里的反引号 ` ` 使x的取值等于expr $x+1,也可以用$()来表示。

9.printf等同于C语言中的用法,格式化输出

10.return命令,可以作为函数的返回值

11.set命令,是为shell设置参数变量

 

set $(date)
echo the month is $2
exit 0

 

12.trap命令

trap 操作命令 信号

当接收到某个信号时,执行指定的操作命令

trap ‘rm –f /tmp/my_tmp_file$$’ INT INT为中断信号

 

两个重要的命令 

find命令

find [路径][选项][测试][行为]

路径就是查找的路径

测试(常用的两种)

-name pattern 文件名按照pattern 匹配

-newer fileneme 文件比fileneme 要新

-type c 文件的类型是c,d(目录文件),f(普通文件)

有时候还会使用组合测试 !/not 测试取反 ; –a/-and 两个测试相与; -o/-or 两个测试相或

eg:\( –name “_*” –or –newer file2 \) 注意这里的\是转义字符。

动作

-exec 命令 执行一个命令,这个动作使用\;字符结束

-print 打印文件名

-ls 对当前文件使用命令ls

 

 

grep命令

grep [选项] pattern [files]

grep -c in file1.txt file2.txt

-c表示输出匹配行的数目

-v表示反匹配

 

 

正则表达式

grep e$ word2.txt 找出结尾是e的行

$表示一行的结尾

^表示一行的开头

[ ] 表示包含的字符范围

. 表示任意单个字符

grep a[[:blank:]] 匹配方式:a加上空格制表符

[:blank:]空格和制表符

[:ascii:] ASCII码字符

 

grep –E [a-z] \{10\} word2.txt

如果指定了用于扩展匹配的-E选项,对于grep命令还需要在这些字符之前加上\字符。

{n} 必须匹配n次

{n,}必须匹配n次及以上

{n,m}必须匹配n次到m次之间

+ 必须匹配1次或多次

* 必须匹配0次或多次

?最多匹配一次

以上就是shell编程的大部分知识,知识点很多很碎,通过这部分可以帮助我们熟悉一下Linux的命令。

本文链接

相关 [shell 编程] 推荐:

Shell编程

- - 博客园_首页
本来打算寒假回家好好学习Linux的,为以后学习嵌入式打好基础的. 回家之后的学习效率非常低,之前为了搭建Linux环境,折腾了很长时间,学到现在也就勉强才把Shell编程学完了. 今天就把自己学习的相关知识点总结整理一下. 个人感觉shell程序跟windows下的批处理文件有点像,就是将一些系统命令写进一个可执行文件中,然后执行.

shell 学习笔记

- tiger - 游戏人生
将脚本目录加到 PATH 中. 在 dash 中如何进行字符串替换. 将 rst 格式文档转换为 blog 可用的 html 代码. shell 脚本虽然不是非常复杂的程序, 但对于首次接触的我来讲, 多少还是有些忌惮. 不过, 接触任何新事物都需要勇敢面对, 逐步树立信心. 我是冲着把脚本写好去的, 所以, 我的目标是能够写出友好, 健壮, 优美的脚本..

GNOME Shell 3.2 预览

- timebug - LinuxTOY
近日 Allan 在他的博客上分享了最近在 GNOME Shell 3.2 上的开发进度. 整合聊天和消息程序(由 Guillaume Desmottes 开发). 登陆系统时自动登陆聊天服务,不再需要额外启动聊天程序. 直接在 Shell 即可语音通话,回复聊天邀请,文件传输. 通知计数器(由 Guillaume Desmottes 开发).

Ubuntu11.10 GNOME Shell指南

- 个人 - 译言-每日精品译文推荐
Ubuntu 11.10终于提供了一种安全方便的方式去安装和使用“GNOME Shell”——GNOME的新桌面交互接口. 这意味着不像之前的版本那样,现在它不需要任何额外的插件,或者执行任何可疑的脚本它可以从Ubuntu软件中心直接安装,只需一次简单的点击. 为了在ubuntu上获得更好的体验我们需要安装一些额外的插件.

Shell 小技巧一则

- Hinc - LinuxTOY
经常与 Shell 为伍的你是不是也会经常碰到下面这些情境: 1$ mv /somewhere/file /your/folder/ 2$ vi /your/folder/file. 要保存某些文件到特定目录,然后开始查看/编辑 1$ cp /somewhere/foo.c /somewhere/foo.c.orig 2$ vi /somewhere/foo.c.

ibus的GNOME Shell扩展

- 小汐 - 画猫不成反类虎
更新代码,支持横排模式(设置后需要重启gnome shell). 这个扩展使用了ibus的一些新API,该API还没有发布,需要自行编译ibus的git仓库代码. 以前说过GNOME3的一个缺点,在通知栏聊天时,无法看到ibus的候选词界面,确切地说是候选词界面被通知栏聊天界面挡住了. 这是GNOME Shell的架构所决定的,目前没有方法可以绕过(除非修改GNOME Shell)本身.

移植Google Calendar到 GNOME Shell

- 欧剃 - 笨兔兔
GNOME Shell Google Calendar 将Google 日历移植到了GNOME Shell上. python脚本可保存密码,自动获取新的谷歌日历事件. 但目前没有图形化的配置界面,导入日历. GNOME 3.2(+3.1.90.x) 目前通过“Online accounts”已经移植了谷歌日历,但是只能在上述版本中实现.

Ubuntu 11.10 GNOME Shell 指南

- 雪冬 - 笨兔兔
注,本文由笔者翻译自 http://www.omgubuntu.co.uk/2011/10/gnome-shell-ubuntu-11-10-guide/. Ubuntu 11.10最终提供给喜欢猎奇的用户一个简单安全的方式来安装和尝试“GNOME Shell”——新的GNOME桌面接口. 这意味着不像之前的Ubuntu发行版,在Ubuntu中安装GNOME Shell不需要添加额外的软件源(PPA)或运行各种脚本:如今它可以在Ubuntu软件中心直接安装——只需要简单地点击一下鼠标即可完成.

Linux shell用法和技巧

- - 外刊IT评论
使用Linux shell是我每天的基本工作,但我经常会忘记一些有用的shell命令和l技巧. 当然,命令我能记住,但我不敢说能记得如何用它执行某个特定任务. 于是,我开始在一个文本文件里记录这些用法,并放在我的Dropbox里,现在,向大家分享这个文件. 需要注意一点的是,有些用法需要在你的Linux系统里安装额外的软件.

Linux shell 用法和技巧

- - Linux - 操作系统 - ITeye博客
使用Linux shell是我每天的基本工作,但我经常会忘记一些有用的shell命令和l技巧. 当然,命令我能记住,但我不敢说能记得如何用它执行某个特定任务. 于 是,我开始在一个文本文件里记录这些用法,并放在我的Dropbox里,现在,向大家分享这个文件. 需要注意一点的是,有些用法 需要在你的Linux系统里安装额外的软件.