shell程序设计(转)
1.shell脚本的基本概念:
(1)Shell执行的是称为shell程序,这些程序通常被称为脚本。
(2)Shell是一个用户和系统间接口的程序,它允许用户向操作系统输入需要执行的命令。
(3)shell包含bash和csh以及其他程序围绕在linux内核的四周。(图1-1)
(4)在linux大多数发行版中,默认的shell程序/bin/sh实际上是对程序/bin/bash的一个链接。
图 1-1
2.管道和重定向
2.1重定向输入和输出
Eg:ls -1 > 1.txt
说明:
使用<和>对输入和输出进行重定向。文件描述符0代表一个程序的标准输入,1代表标准输出,2代表错误输出。
你可以使用>>操作符将输出的内容附加到原有内容之后。
Eg: ps >> 1.txt
下面的命令将把标准输出和标准错误输出分别重定向到不同的文件中。
Eg:kill -HUP 1234 >killout.txt 2>killerr.txt
用>&操作符来结合两个输出。
Eg:Kill -l 1234 >killouterr.txt 2>&1
Tip:返回码一般保存在linux通用“回收站”/dev/null来丢弃所有的输出信息。
Eg: Kill -l 1234 >/dev/null 2>&1
重定向标准输入。
Eg:More <killout.txt
More可以接受文件名作为参数。
2.2管道
用管道操作符|来链接进程。在linux下通过管道链接的进程可以同时运行,并且随着数据流在它们之间的传递可以自动地协调。
Eg: Ps > psout.txt Sort psout.txt > pssort.out
可以由一个命令解决: Ps | sort > pssort.out
3.作为程序设计语言
在命令行上直接输入shell脚本是一种测试短小代码段的简单而快捷的方式。
Eg:
$For file in *
>Do
>If grep -l POSIX $file
>Then
>More $file
>Fi
>done
当shell期待进一步的输入时,正常的$shell提示符将改变为>提示符。你可以一直输入下去,由shell
来判断何时输入完毕并立刻执行脚本程序。 Shell还提供了通配符扩展可以(globbing)。可以用通
配符*来匹配一个字符串,也可以用通配符?来匹配单个字符,而[set]允许匹配方括号中任何一个单
字符,[^set]对方括号中的内容取返,即匹配任何没有出现在给出的字符集中的字符。扩展的花括号
{}(只能用在部分shell中,其中包含shell)允许你将任意的字符串放在一个集合中,已供shell扩展。
Eg:
Ls my_{finger,toe}s
这个命令将列出my_fingers和my_toe,它使用shell来检查当前目录下的每个文件。
3.1创建脚本
Eg:
#!/bin/sh
#first
#This file look through all the files in the current
#directory for the string POSIX,and then pringts the names of
#those files to the standard output
For file in *
Do
If grep -q POSIX $file
Then
Echo $file
Fi
Done
Exit 0
程序中的注释以#符号开始,一直持续到该行结束。请注意第一行#/bin/sh,它是一种特殊形式的注释,
#!字符告诉系统同一行上紧跟在它后面的那个参数是用来执行本文件的程序。 因为脚本程序本质上被
看作是shell的标准输入,所以它可以包含任何能够通过你的PATH环境变量引用的linux命令。
3.2..把脚本设置为可执行 运行脚本有两种方法。
比较简单一点的方法是调用shell,并把脚本文件名当成一个参数,
eg: /bin/sh first
另一种:
Eg: Chmod +x first ./first
如果直接调用first可能会打印未找到命令。这种情况很可能发生,因为shell环境变量PATH并没有设置
为当前目录下查找要执行的命令。要解决这个问题,一种是输入PATH=$PATH:.或编辑你的.bash_profile
文件,将刚才这条命令添加到文件的末尾。./first的作用是把脚本程序的完整的相对路径告诉shell。
4shell的语法
4.1变量 在shell里,使用变量之前通常并不需要事先为它们作出声明。你只是通过使用 它们来创建它们。
在默认情况下,所有变量都被看做字符串并以字符串来存储,即使它们被赋值为数值时也是如此。Shell
和一些工具程序会在需要时把数值型字符串转化为对应的数值以对它们进行操作。 在shell中,你可以通
过在变量名前加一个$符号来访问它的内容。当你为变量赋值时,你只需要使用变量名,该变量会根据需
要自动创建。
4.1.1使用引号 一般情况下,脚本文件中的参数包含空白字符分隔(列如,一个空格、一个制表符或者一个换行符)。
如果你想在一个参数中包含一个或多个空白字符,你就必须给参数加上引号。 如果你把一个$变量表达式放在双引号中,
程序执行到这一行时就会把变量替换为它的值; 如果你把它放在单引号中,就不会发生替换现象。你还可以通过在$字符
前面加上一个\字符取消它的特殊含义。
Eg:
#!/bin/sh
Myvar=”Hi there”
Echo $myvar
Echo “$myvar”
Echo ‘$myvar’
Echo \$myvar
Echo enter some text Read myvar
Echo ‘$myvar’ now equals $myvar
Exit 0
4.1.2环境变量
当一个shell脚本程序开始执行时,一些变量会根据环境设置中的值进行初始化。这些变量通常用大写字母做名字。
具体创建的变量取决于你的个人配置。参见表4-1。
4.1.3参数变量
如果脚本程序在调用时带有参数,一些额外的变量就会被创建。即使没有传递任何参数,环境变量$#也依
然存在,只不过它的值是0罢了。参见表4-2。
4.2 条件
Test或[命令
在实际工作中,大多数脚本程序都会广泛使用shell的布尔判断命令或[或test。为了增强可读性,当使用[命令时,
我们还使用符号]来结尾。
Eg:
If test -f fred.c
Then
...
Fi
也可以写成:
If [ -f fred.c ]
Then
...
Fi
Tip:必须在[符号和被检查的条件之间留出空格。
Test命令可以使用的条件类型分3类:
(1)字符串比较
(2)算术比较
(3)文件有关的条件测试
4.2.1 控制结构 if语句
Eg:
If condition
Then
Statements
Else
Statements
Fi
elif语句:
Eg:
If condition
Then
Statements
Elif
Statements
Else
Statements
Fi
for语句
For variable in value
Do
statements
Done
While语句
While condition
do
Statements
Done
Until语句
Untilcondition
Do
Statements
Done
case语句
Case variable in
Pattern [ | pattern] ...) statements;;
Pattern [ | pattern] ...) statements;;
...
Esac
命令列表 AND列表
语法: Statements1 && Statements2 && Statements3 && ...
从左开始执行每条命令,如果前一条命令返回的是true,右边的下一条命令才能够执行。AND作为一个整体,只有在
列表中的所有命令都执行成功时,才算它执行成功,否则就算它失败。
OR列表 语法:
Statements1 || Statements2 || Statements3 || ...
从左开始顺序执行每条命令。如果前一条命令返回的是false,它右边的下一条命令才能够被执行。 语句块 某些地方
只允许使用单个语句的地方(比如在AND或OR列表中)使用多条语句,可以把它们括在{}中来构造一个语句块。
Eg:
Get_confirm && {
Grep -v “$cdcatnum” $tracks_file > $temp_file
Cat $temp_file > $tracks_file
Echo Add_record_tracks
}
函数 定义shell函数:
Function_name ()
{
statements
}
你可以通过return命令让函数返回数字值。
Foo ()
{
echo JAY;
}
...
Result=”$(foo)”
你也可以使用local关键字在shell函数中声明局部变量。
2、文件内容行之间的排序 Shell代码
#!/bin/bash
sort -t= +4
文件
备注:“=”表示按=号进行切割(注意:只能是单个字符),“+4”表示按第五个项进行排序。
更多参数:
-r 表示降序排序
-n 表示按数字大小排序
-k 表示根据那个字段排序,4.1,表示第4列第一个字符开始 ,5表示到第5个字段为结束
-t 后面跟分隔符,缺省是空格
例如:sort -r -n -k4.1,5 功能说明:删除变量或函数。
语法:unset [-fv][变量或函数名称]
补充说明:unset为shell内建指令,可删除变量或函数。
参数:
-f 仅删除函数。
-v 仅删除变量
http://www.cnblogs.com/myhello-world/p/hi_laotou.html
shell程序设计(转)的更多相关文章
- Linux 的使用基础---Shell程序设计
Shell是Linux系统中的一个重要的层次,它是用户与系统交互作用的界面.Shell除了作为命令解释程序以外,还是一种高级程序设计语言.利用Shell程序设计语言可以编写出功能很强.但代码简单的程序 ...
- Linux程序设计之shell程序设计
看了<linux程序设计(第4版)>(作者:Neil Matthew ,Richard Stones ,陈建 ,宋健建译).做个笔记,以备后面查看. 首先,清楚几个概念. shell编程属 ...
- Linux shell 程序设计
shell 程序设计 主要的学习内容包含基本思路,语法:变量.条件判断和程序控制,命令列表,函数,命令及执行,调试,grep命令和正则表达式,find命令 什么是shell 适用编写执行相对简单任务的 ...
- shell程序设计
1.shell脚本的基本概念: (1)Shell执行的是称为shell程序,这些程序通常被称为脚本. (2)Shell是一个用户和系统间接口的程序,它允许用户向操作系统输入需要执行的命令. (3)sh ...
- Linux程序设计(二)shell程序设计
1. 管道和重定向 文件描述符0:一个程序的标准输入 文件描述符1:标准输出 文件描述符2:标准错误输出 >操作符:把标准输出重定向到一个文件. >>操作符:将输出内容附加到一个文件 ...
- 【Shell编程】Shell程序设计
1.Shell简介 作为Linux灵感来源的Unix系统最初是没有图形化界面的,所有的任务都是通过命令行来实现的.因此,Unix的命令行系统得到了很大的发展,逐步成为一个功能强大的系统. Sh ...
- Linux命令(十)——Shell程序设计一(变量与操作符)
Shell是linux系统中用户和系统交互的接口,它除了作为命令解释器以外,还是一种高级程序设计语言.在前面介绍的linux命令中,Shell都作为命令解释器出现.下面分两节简单介绍脚本程序设计中的语 ...
- Linux操作系统之Shell程序设计
Shell是种命令解释程序,也可以看作是一种命令语言的解释器. 用户在与Shell交互时所输入的命令行必须符合Shell命令的语法和语义规范,才能够被Shell理解并执行.Shell所使用的这种命令语 ...
- Unix Shell 程序设计 —— 正则表达式
参考:http://www.cnblogs.com/erichhuang/archive/2012/03/13/2394119.html 简介: 简单的说,正则表达式是一种可以用于模式匹配和替换的强有 ...
随机推荐
- hdu 1875 畅通project再续
链接:hdu 1875 输入n个岛的坐标,已知修桥100元/米,若能n个岛连通.输出最小费用,否则输出"oh!" 限制条件:2个小岛之间的距离不能小于10米,也不能大于1000米 ...
- - 通过 UIBezierPath 做一个中空的扫描器
今天在公司的代码里看到通过 UIBezierPath 绘制 CALayer 然后实现中空的正方形,感觉还挺有意思的,简单记录一下 UIBezierPath 这个东西. 一条线 我们自定义一个 Bezi ...
- 【NGROK】快速实现本地Web服务到外网的映射
NGROK官网:https://ngrok.com NGROK百科:http://baike.baidu.com/view/13085941.htm?fr=aladdin 使用ngrok(Window ...
- Android 中 ListView Adapter getView 被多次调用问题 解决方法
执行多次原因是因为每显示一个VIew,它都去测量view的高度,执行measure方法,导致getView执行多次. 解决方法是将 ListView 的 layout_width 设置为 fill_p ...
- ZOJ2971 Give Me the Number 【模拟】
这道题目使用Map. 然后一次性遍历下来即可. QAQ 注意初始化的时候小心点不要错.. Source Code: //#pragma comment(linker, "/STACK:167 ...
- POJ 2449 求第K短路
第一道第K短路的题目 QAQ 拿裸的DIJKSTRA + 不断扩展的A* 给2000MS过了 题意:大意是 有N个station 要求从s点到t点 的第k短路 (不过我看题意说的好像是从t到s 可能是 ...
- printk
printk的日志级别定义如下(在linux/kernel.h中): #define KERN_EMERG "<0>"/*紧急事件消息,系统崩溃之前提示,表示系统不可用 ...
- 【Demo 0025】注册/反注册窗体类RegisterClassEx/UnregisterClass
所有窗体在创建前都必须注册窗体类,只有注册的窗体类才被系统认知并允许实例化,换句话说通过注册告诉进程窗体管理器此类窗体的属性如: 背景色,窗体上的鼠标样式以及窗体事件处理函数等; 有一些控件类系统自 ...
- Office 365 - SharePoint 2013 Online之加入App开发工具Napa
1.新建一个站点集,模板选择开发者模板.例如以下图: 2.确定以后,须要稍等一会儿; 3.点击站点内容,加入app,例如以下图: 4.进入SharePoint Store.选择Napa.例如以下图: ...
- ACM比赛(11462 Age Sort)
You are given the ages (in years) of all people of a country with at least 1 year of age. You know t ...