Shell脚本大量示例

几乎所有的脚本里都有某种流控制结构,很少有例外。流控制是什么?假定有一个脚本,包含下列几个命令:

#!/bin/sh
# make a directory
mkdir /home/dave/mydocs
# copy all doc files
cp *.docs /home/dave/docs
# delete all doc files
rm *.docs

上述脚本问题出在哪里?如果目录创建失败或目录创建成功文件拷贝失败,如何处理?这里需要从不同的目录中拷贝不同的文件。必须在命令执行前或最后的命令退出前决定处理方法。shell会提供一系列命令声明语句等补救措施来帮助你在命令成功或失败时,或需要处理一个命令清单时采取正确的动作。这些命令语句大概分两类:

1、循环和流控制

  • if 语句
    提供条件测试。测试可以基于各种条件。例如文件的权限、长度、数值或字符串的比较。这些测试返回值或者为真(0),或者为假(1)。基于此结果,可以进行相关操作。在讲到条件测试时已经涉及了一些测试语法。
  • case语句
    允许匹配模式、单词或值。一旦模式或值匹配,就可以基这个匹配条件作其他声明。

2、循环

循环或跳转是一系列命令的重复执行过程,本书提到了3种循环语句:

  • for 循环
    每次处理依次列表内信息,直至循环耗尽。
  • Until 循环
    此循环语句不常使用, until循环直至条件为真。条件部分在循环末尾部分。
  • While 循环
    while循环当条件为真时,循环执行,条件部分在循环头。
    流控制语句的任何循环均可嵌套使用,例如可以在一个for循环中嵌入另一个for循环。

二、实例讲解

现在开始讲解循环和控制流,并举一些脚本实例。

从现在起,脚本中语句使用LINUX或BSD版本,也就是说使用echo方法echo -e -n,意即从echo结尾中下一行执行命令。

1、grep输出检查

不必拘泥于变量或数值测试,也可以测知系统命令是否成功返回。对grep使用if语句找出,grep是否成功返回信息。下面的例子中grep用于查看Dave是否在数据文件data.file中,注意’Dave>‘用于精确匹配。
[root@localhost ~]# cat grepif.sh 
#!/bin/sh
# grepif.sh
if grep 'Dave\>' data.file > /dev/null 2>&1
thenecho "Great Dave is in the file"
elseecho "No Dave is not in the file"
fi
[root@localhost ~]# ./grepif.sh 
No Dave is not in the file

2、用变量测试grep输出

正像前面看到的,可以用grep作字符串操作。下面的脚本中,用户输入一个名字列表,grep在变量中查找,要求其包含人名Peter
[root@localhost ~]# cat grepstr.sh 
#!/bin/sh
# grepstr
echo -n "Enter a list of names:"
read list
if echo $list | grep "Peter" > /dev/null 2>&1
thenecho "Peter is here"# could do some processing here...
elseecho "Peter's not in the list. No comment!"
fi
[root@localhost ~]# ./grepstr.sh 
Enter a list of names:John Louise Peter James
Peter is here

3、文件拷贝输出检查

下面测试文件拷贝是否正常,如果cp命令并没有拷贝文件myfile到myfile.bak,则打印错误信息。注意错误信息中basename $0打印脚本名。如果脚本错误退出,一个好习惯是显示脚本名并将之定向到标准错误中。用户应该知道产生错误的脚本名。
 [root@localhost ~]# cat ifcp.sh 
#!/bin/sh
# ifcp.sh
if cp myfile myfile.bak; thenecho "good copy"
elseecho "`basename $0`: error could not copy the file" >&2
fi
[root@localhost ~]# ./ifcp.sh 
cp: cannot stat `myfile': No such file or directory
ifcp.sh: error could not copy the file
注意,文件可能没找到,系统也产生本身的错误信息,这类错误信息可能与输出混在一起。既然已经显示系统错误信息获知脚本失败,就没必要显示两次。要去除系统产生的错误和系统输出,只需简单的将标准错误和输出重定向即可。修改脚本为: >/dev/null 2>&1。
[root@localhost ~]# cat ifcp.sh 
#!/bin/sh
# ifcp.sh
if cp myfile myfile.bak > /dev/null 2>&1; thenecho "good copy"
elseecho "`basename $0`: error could not copy the file" >&2
fi
[root@localhost ~]# ./ifcp.sh 
ifcp.sh: error could not copy the file
上面当中>/dev/null表示任何标准输出都定向到那个无尽的“黑洞”/de/null中,然后2>&1表示错误输出也是到/dev/null中,&1表示前面的那个/dev/null,脚本运行时,所有输出包括错误重定向至系统垃圾堆。

4、当前目录测试

当运行一些管理脚本时,可能要在根目录下运行它,特别是移动某种全局文件或进行权限改变时。一个简单的测试可以获知是否运行在根目录下。下面脚本中变量DIRECTORY使用当前目录的命令替换操作,然后此变量值与” / “字符串比较( /为根目录)。如果变量值与字符串不等,则用户退出脚本,退出状态为1意味错误信息产生。
[root@localhost ~]# cat ifpwd.sh 
#!/bin/sh
# ifpwd.sh
DIRECTORY=`pwd`
# grab the current dirctory
if [ "$DIRECTORY" != "/" ]; then# is it the root directory ?# no, the direct output to standard error, which is the screen# by default.echo "You need to be in the root directory no $DIRECTORY to runthis script" >&2# exit with a value of 1, an errorexit 1
fi
[root@localhost ~]# ./ifpwd.sh 
You need to be in the root directory no /root to runthis script

5、文件权限测试

可以用i f语句测试文件权限,下面简单测试文件test.txt是否被设置到变量LOGNAME,测试test.txt文件是否具有写的权限。下面的脚本先建立一个test.txt的空白文档,列出它的相关权限。然后执行脚本测试其是否可以写入,然后显示相关信息。
[root@localhost ~www.yigouyule2.cn]# touch test.txt
[root@localhost ~www.feifanyule.cn/]# ls -l test.txt
-rw-r--r-- 1 root www.boshenyl.cn root 0 Nov 21 15:21 test.txt
[root@localhost ~www.taohuayuan178.com]# chmod u+x ifwr.sh 
[root@localhost www.qinlinyule.cn~]# cat ifwr.sh 
#!/bin/sh
# ifwr.sh
LOGFILE=test.txt
echo $LOGFILE
if [ ! -w "$LOGFILE" ]; thenecho " You cannot write to $LOGFILE" >&2
elseecho " You can write to $LOGFILE" >&2
fi
[root@localhost ~]# ./ifwr.sh 
test.txt
You can write to test.txt

6、测试传递到脚本中的参数

if语句可用来测试传入脚本中参数的个数。使用特定变量$#,表示调用参数的个数。可以测试所需参数个数与调用参数个数是否相等。以下测试确保脚本有三个参数。如果没有,则返回一个可用信息到标准错误,然后代码退出并显示退出状态。如果参数数目等于3,则显示所有参数。
 [root@localhost ~]# cat ifparam.sh 
#!/bin/sh
# ifparam
if [ $# -lt 3 ]; then# less than 3 parameters called, echo a usage message and exit# 如果少于三个参数则显示使用的信息,然后退出。echo "Usage: `basename $0`arg1 arg2 arg3" >&2exit 1
fi
# good, received 3 params, let's echo them
# 好,现在接受了三个参数,让我们开始显示他们
echo "arg1: $1"
echo "arg2: $2"
echo "arg3: $3"
[root@localhost ~]# ./ifparam.sh cup medal
Usage: ifparam.sharg1 arg2 arg3
[root@localhost ~]# ./ifparam.sh cup medal trophy
arg1: cup
arg2: medal
arg3: trophy
从上面的运行信息可以看出,如果只传入两个参数,则显示一可用信息,然后脚本退出。只有正确传入了三个参数了,才显示所有的参数然后退出。

7、决定脚本是否为交互模式

有时需要知道脚本运行是交互模式(终端模式)还是非交互模式(cron或at)。脚本也许需要这个信息以决定从哪里取得输入以及输出到哪里,使用test命令并带有-t选项很容易确认这一点。如果test返回值为1,则为交互模式。假如我是在一个终端下运行下面这个脚本。
[root@localhost ~]# cat ifinteractive.sh 
#!/bin/sh
# ifinteractive.sh
if [ -t ]; thenecho "We are interactive with a terminal"
elseecho "We must be running from some background process probablycron or at"
fi
[root@localhost ~]# ./ifinteractive.sh 
We are interactive with a terminal

8、变量设置测试

下面的例子测试环境变量EDITOR是否已设置。如果EDITOR变量为空,将此信息通知用户。如果已设置,在屏幕上显示编辑类型。
 [root@localhost ~]# cat ifeditor.sh #!/bin/sh# ifeditor.shif [ -z $EDITOR ]; then# the variable has not been set# 变量没有设置echo "Your EDITOR environment is not set"else# let's see what it is# 如果设置了,让我们来看看它到底是什么echo "Using $EDITOR as the default editor"fi[root@localhost ~]# ./ifeditor.sh Your EDITOR environment is not set

9、将脚本参数传入系统命令

可以向脚本传递位置参数,然后测试变量。这里,如果用户在脚本名字后键入目录名,脚本将重设$1特殊变量为一更有意义的名字。即DIRECTORY。这里需测试目录是否为空,如果目录为空,ls -A将返回空,然后对此返回一信息。
# ifdirec.sh
# assigning $1 to DIRECTORY variable
DIRECTORY=$1
if [ "`ls -A $DIRECTORY`" == "" ]; then# if it's an empty string, then it's emptyecho "$DIRECTORY is indeed empty"
else    # otherwise it is notecho "$DIRECTORY is not empty"
fi
也可以使用下面的脚本替代上面的例子并产生同样的结果
[root@localhost ~]# cat ifdirec2.sh 
#!/bin/sh
# ifdirec2
DIRECTORY=$1
if [ -z "`ls -A $DIRECTORY`" ]
thenecho "$DIRECTORY is indeed empty"
elseecho "$DIRECTORY is not empty"
fi

10、null命令用法

到目前为止,条件测试已经讲完了then和else部分,有时也许使用者并不关心条件为真或为假。不幸的是if语句各部分不能为空—一些语句已经可以这样做。为解决此问题, shell提供了:空命令。空命令永远为真(也正是预想的那样)。回到前面的例子,如果目录为空,可以只在then部分加入命令。
[root@localhost ~]# cat ifdirectory.sh 
#!/bin/sh
# ifdirectory.sh
DIRECTORY=$1
if [ "`ls -A $DIRECTORY`" == "" ]
thenecho "$DIRECTORY is indeed empty"
else :# do nothing
fi
[root@localhost ~]# ./ifdirectory.sh testd
testd is indeed empty

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/538616.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spark 常见问题小结

原文地址:http://www.aboutyun.com/thread-9946-1-1.html -------------------------------------- 问题导读 1、当前集群的可用资源不能满足应用程序的需求,怎么解决? 2、内存里堆的东西太多了,有什么好办法吗? …

dataframe数据标准化处理_数据预处理——标准化/归一化(实例)

这次我们来说说关于数据预处理中的数据标准化及归一化的问题。主要以理论实例的方式为大家展示。本次实验也将会展示部分数据以及代码,有兴趣的小伙伴可以自己动手试试~在本次实例过程中,我们使用的数据是:2010-2018年间广州市经济与环境的时…

python实现自动打电话软件_全自动手势联系软件 让你轻轻松松打电话

电话号码超级多的童鞋们,由于手机里存储的电话太多,每次要找某个人的电话很难找,有木有同感的?小编今天像大家推荐一款新潮的帮助你轻松找到想要的电话的模式,有没有很想知道呢?其实小编本来是想卖个关子的…

电脑的虚拟服务器位置,如何配置基于IP地址的虚拟主机

满意答案虚拟主机简介:1. 把一台运行在互联网上的服务器分成多个虚拟的服务器。2. 每一个虚拟主机都具有独立的域名和完整的Internet服务器(支持WWW,FTP,E-mail等)。3. 一台服务器上的不同虚拟主机是各自独…

VMware配置额外内存设置

配置额外内存设置 额外内存设置用于控制主机系统中的内存管理器如何将虚拟机从物理 RAM 中换出。 要配置额外内存设置,请选择[编辑] > [首选项] > [内存]。 [调整所有虚拟机内存使其适应预留的主机 RAM] 选择此选项会对给定时间内可以运行的虚拟机的数量和内…

Kafka.net使用编程入门(一)

最近研究分布式消息队列,分享下! 首先zookeeper 和 kafka 压缩包 解压 并配置好! 我本机zookeeper环境配置如下: D:\Worksoftware\ApacheZookeeper3\conf\zoo.cfg 以下是kafka的配置 D:\Worksoftware\Apachekafka2.11\config\server.propert…

下拉推广系统立择火星推荐_下拉词删除都择火星下拉

会员注册发帖做推广的人都离不开搜索引擎,就像鱼离不开水,很多时候我们做SEO的朋友都在研究各大搜索引擎的机制,收录,排名规则或者是黑帽技术,不管如何,只是希望把自己的企业,产品,服…

python包路径有几个_python的搜索路径与包(package)

python的搜索路径其实是一个列表,它是指导入模块时,python会自动去找搜索这个列表当中的路径,如果路径中存在要导入的模块文件则导入成功,否则导入失败: >>> importsys>>>sys.path [, C:\\Python33\…

配置文件管理服务器,06-配置文件管理

1配置文件管理设备运行于FIPS模式时,本特性部分配置相对于非FIPS模式有所变化,具体差异请见本文相关描述。有关FIPS模式的详细介绍请参见“安全配置指导”中的“FIPS”。1.1 配置文件简介配置文件是用来保存配置的文件。配置文件主要用于: …

虚拟机安装spark配置推荐

如果虚拟机配置的内存太少,spark运行计算的时候会报: WARN TaskSchedulerImpl: Initial job has not accepted any resources; check your cluster uito ensure that workers are registered and have sufficient memory 资源不足的问题,导…

c++输入一个整数判断是否为完全平方数_matlab判断一个整数是完全平方数

(C语言c)判断一个数是否是 完全平方数的 整数倍#include#includeint ispow(int x){ int&用c编判断一个数是否是完全数#include#includeintmain(){intn;printf("请输入一个数,然后按回车键:\n");scanf("%d",&n);inti,p1;for(i2;i*i编…

Linux常用命令——chattr、lsattr

chattr 改变文件的扩展属性 语法格式:chattr 【option】【mode】【files】chattr [选项] [模式] [文件或目录]注意:chattr 命令及后面的选项和文件里,每个元素之间都要至少要有一个空格参数选项: 参数选项解释说明-a只能向文件中…

两个相邻盒子的边框怎么只显示一个_【前端小课堂】0044 盒子

这是一个面向零基础的前端教程,很简单,用零散时间就可以学习。 推荐早上读一下,晚上复习一下,如果可以奢侈一点,白天稍微练习一下下,总共花费 5~15 分钟。就酱!已经好几次提到块(block)元素了&a…

scala apply方法 笔记

原文出处:http://blog.csdn.net/pzw_0612/article/details/48576569 ----------------------------------------------------- Scala比Java更面向对象的一个方面是Scala没有静态成员。替代品是,Scala有单例对象:singleton object。 当单例对…

转:6.1海量数据处理

本文转自看云,原文地址请移步:https://www.kancloud.cn/kancloud/the-art-of-programming/41608 偶然闲游,偶遇某一站点,发现这里写的关于海量数据处理相关的思路还挺不错,所以在这里采摘收藏,如有侵权之处还请评论区或…

python爬去中国天气网_python爬取中国天气网并展示最低温度

import requestsfrom bs4 import BeautifulSoupimport lxmlimport jsonfrom echarts import Echart,Bar,Axisimport time#城市与温度的集合weather_list []#城市集合city_list []#温蒂集合lowest_list []#获取温度def getTemperature(url):result requests.get(url)#print r…

flash一个按钮控制动画_flutter闪屏过渡动画,闪光占位动画

在程序设计的理念中,讲究一切都来源于物理世界,在现实世界中,人们在每接触到一个新的事物或者说在手指触碰到一个事物时,总是心里默许期望有一个反馈效果,这就是来源于心底深处常常被人忽略的一个潜在期望。在程序的世…

scala-wordcount

/* * Mapreduce步骤 * 1、map&#xff1a;获取一行 * 2、按空格分隔 * 3、每个单词统计&#xff0c;<key,1> 输出到 reducer * 4、reducer <key,{1,1,1,1,1}> 汇总 * 5、输出结果 */ 1、声明一个集合&#xff0c;模仿要统计的…

动态改变_Excel中如何动态改变可编辑区域?

有这样一个工作场景&#xff1a;我们制作一个工作报表模板给同事填写数据&#xff0c;这个工作表格只可以在预设的可编辑区域编辑&#xff0c;其它都是受密码保护的&#xff0c;而且这个可编辑区域是随着日期——工作周的变化而发生变化的。也就是说在不同的工作周可编辑的区域…

java集合框架之ArrayList与LinkedList的区别

参考http://how2j.cn/k/collection/collection-arraylist-vs-linkedlist/690.html#nowhere ArrayList和LinkedList的区别 ArrayList 插入&#xff0c;删除数据慢LinkedList&#xff0c; 插入&#xff0c;删除数据快ArrayList是顺序结构&#xff0c;所以定位很快&#xff0c;指哪…