linux shell 脚本个人规范总结

一、shell 语句格式

linux shell有一套自己的流程控制语句,其中包括条件语句(if),循环语句(for,while),选择语句(case)。下面我将通过例子介绍下,各个语句使用方法。

1.1、if语句结构[if/then/elif/else/fi]

if 条件测试语句 thenaction
[elif 条件action
elseaction
]
fi

如果对于:条件测试语句不是很清楚,可以先参考第二部分 shell 逻辑运算符、逻辑表达式详解

shell命令,可以按照分号分割,也可以按照换行符分割。如果想一行写入多个命令,可以通过" ;"分割。如:

# a=5;if [[ a -gt 4 ]] ;then echo 'ok';fi; 
ok

实例(test.sh) (结果 输出 no pass!)

#!/bin/sh
scores=40;
if [[ $scores -gt 90 ]]; thenecho "very good!";
elif [[ $scores -gt 80 ]]; thenecho "good!";
elif [[ $scores -gt 60 ]]; thenecho "pass!";
elseecho "no pass!";
fi;

条件测试有:[[]],[],test 这几种,注意:[[]] 与变量之间用空格分开。

1.2、循环语句(for,while,until用法)

1.2.1、for循环使用方法(for/do/done)

语法结构:

1.forin 语句
for 变量 in seq字符串;doaction
done
说明:seq字符串 只要用空格字符分割,每次for…in 读取时候,就会按顺序将读到值,给前面的变量。

实例(testfor.sh):(结果分行输出1,
2345678910
#
!/bin/sh for i in $(seq 10); doecho $i; done;

自定义实例:

for i in python-devel readline-develsqlite-devel bzip2-devel openssl-devel ncurses-devel zlib-devel readline sqlite bzip2 openssl libdbi ncurseszlib;doresult=`rpm -qa $i`if [ ! -n "$result" ]thenyum -y install $i&>/dev/nullelseecho "--$i is install--"fi
done
filelist=`ls -l|awk {'print $9'}`
for file in $filelist
doif [ -f $file ]thenecho "echo ${file}"fi
done

另一种for循环表达式

2.for((赋值;条件;运算语句))for((赋值;条件;运算语句));doaction
done;实例(testfor2.sh):(结果分行输出1,2345678910)
#!/bin/sh
for((i=1;i<=10;i++));doecho $i;
done;

1.2.2、while循环使用(while/do/done)

while语句结构while 条件语句;doaction
done;实例1:
#!/bin/sh
i=10;
while [[ $i -gt 5 ]];doecho $i;((i--));
done;
运行结果:sh testwhile1.sh
10
9
8
7
6
实例2:(循环读取文件内容:)
#!/bin/sh
while read line;doecho $line;
done < /etc/hosts;

运行结果:
sh testwhile2.sh # Do not remove the following line, or various programs # that require network functionality will fail. 127.0.0.1 centos6 localhost.localdomain localhost

1.2.3、until循环语句

语法结构:
until 条件;doaction
done
意思是:直到满足条件,就退出。否则执行action.实例(testuntil.sh):
#!/bin/sh
a=10;
until [[ $a -lt 0 ]];doecho $a;((a—));
done;
运行:sh testuntil.sh (分行输出 10 9 8 7 6 5 4 3 2 1 0 中的一个数字)

1.3、shell选择语句(case、select用法)

1.3.1、case选择语句使用(case/esac)

语法结构
case $arg in  pattern | sample) # arg in pattern or sample  ;;  pattern1) # arg in pattern1  ;;  *) #default  ;;  
esac 
说明:pattern1 是正则表达式,可以用下面字符:*       任意字串?       任意字元[abc]   a, b, 或c三字元其中之一[a-n]   从a到n的任一字元|       多重选择
实例:
#!/bin/sh 
case $1 in
start | begin)echo "start something"  ;;
stop | end)echo "stop something"  ;;
*)echo "Ignorant"  ;;
esac
运行:testcase.sh start
start something

1.3.2、select语句使用方法(产生菜单选择)

语法:
select 变量name  in seq变量
doaction
done
实例:
#!/bin/sh 
select ch in "begin" "end" "exit"
do
case $ch in
"begin")echo "start something"  ;;
"end")echo "stop something"  ;;
"exit")echo "exit"  break;;;
*)echo "Ignorant"  ;;
esac
done;

运行结果(说明:select是循环选择,一般与case语句使用。)

sh testselect.sh
1) begin
2) end
3) exit
#? begin
Ignorant
#? 1
start something
#? 2
stop something
#? 3
exit 

二、shell 逻辑运算符、逻辑表达式详解

shell的逻辑运算符 涉及有以下几种类型,因此只要适当选择,可以解决我们很多复杂的判断,达到事半功倍效果。

2.1、逻辑运算符

逻辑卷标表示意思
1.关于档案与目录的侦测逻辑卷标!
-f常用!侦测『档案』是否存在 eg: if [ -f filename ]
-d常用!侦测『目录』是否存在
-b侦测是否为一个『 block 档案』
-c侦测是否为一个『 character 档案』
-S侦测是否为一个『 socket 标签档案』
-L侦测是否为一个『 symbolic link 的档案』
-e侦测『某个东西』是否存在!
2.关于程序的逻辑卷标!
-G侦测是否由 GID 所执行的程序所拥有
-O侦测是否由 UID 所执行的程序所拥有
-p侦测是否为程序间传送信息的 name pipe 或是 FIFO (老实说,这个不太懂!)
3.关于档案的属性侦测!
-r侦测是否为可读的属性
-w侦测是否为可以写入的属性
-x侦测是否为可执行的属性
-s侦测是否为『非空白档案』
-u侦测是否具有『 SUID 』的属性
-g侦测是否具有『 SGID 』的属性
-k侦测是否具有『 sticky bit 』的属性
4.两个档案之间的判断与比较 ;例如[ test file1 -nt file2 ]
-nt第一个档案比第二个档案新
-ot第一个档案比第二个档案旧
-ef第一个档案与第二个档案为同一个档案( link 之类的档案)
5.逻辑的『和(and)』『或(or)』
&&逻辑的 AND 的意思
||逻辑的 OR 的意思

 

运算符号代表意义
=等于 应用于:整型或字符串比较 如果在[] 中,只能是字符串
!=不等于 应用于:整型或字符串比较 如果在[] 中,只能是字符串
<小于 应用于:整型比较 在[] 中,不能使用 表示字符串
>大于 应用于:整型比较 在[] 中,不能使用 表示字符串
-eq等于 应用于:整型比较
-ne不等于 应用于:整型比较
-lt小于 应用于:整型比较
-gt大于 应用于:整型比较
-le小于或等于 应用于:整型比较
-ge大于或等于 应用于:整型比较
-a双方都成立(and) 逻辑表达式 –a 逻辑表达式
-o单方成立(or) 逻辑表达式 –o 逻辑表达式
-z空字符串
-n非空字符串

 

2.2、逻辑表达式

 test 命令

使用方法:test EXPRESSION,如:
[root@localhost ~]# test 1 = 1 && echo 'ok'
ok
[root@localhost ~]# test -d /etc/ && echo 'ok' 
ok
[root@localhost ~]# test 1 -eq 1 && echo 'ok'
ok
[root@localhost ~]# if test 1 = 1 ; then echo 'ok'; fi
ok

注意:所有字符 与逻辑运算符直接用“空格”分开,不能连到一起。

2.3、精简表达式

[] 表达式[root@localhost ~]# [ 1 -eq 1 ] && echo 'ok'           
ok[root@localhost ~]# [ 2 < 1 ] && echo 'ok'                  
-bash: 2: No such file or directory[root@localhost ~]# [ 2 \< 1 ] && echo 'ok'[root@localhost ~]# [ 2 -gt 1 -a 3 -lt 4 ] && echo 'ok'
ok    [root@localhost ~]# [ 2 -gt 1 && 3 -lt 4 ] && echo 'ok'   
-bash: [: missing `]'

注意:在[] 表达式中,常见的>,<需要加转义字符,表示字符串大小比较,以acill码 位置作为比较。 不直接支持<>运算符,还有逻辑运算符|| && 它需要用-a[and] –o[or]表示 

[[]] 表达式[root@localhost ~]# [ 1 -eq 1 ] && echo 'ok'           
ok
[root@localhost ~]$ [[ 2 < 3 ]] && echo 'ok' 
ok
[root@localhost ~]$ [[ 2 < 3 && 4 > 5 ]] && echo 'ok' 
ok

注意:[[]] 运算符只是[]运算符的扩充。能够支持<,>符号运算不需要转义符,它还是以字符串比较大小。里面支持逻辑运算符:|| &&

2.3、性能比较

bash的条件表达式中有三个几乎等效的符号和命令:test,[]和[[]]。通常,大家习惯用if [];then这样的形式。而[[]]的出现,根据ABS所说,是为了兼容><之类的运算符。以下是比较它们性能,发现[[]]是最快的。

# time (for m in {1..100000}; do test -d .;done;)
real    0m0.658s
user    0m0.558s
sys     0m0.100s
# time (for m in {1..100000}; do [ -d . ];done;)
real    0m0.609s
user    0m0.524s
sys     0m0.085s
# time (for m in {1..100000}; do [[ -d . ]];done;)
real    0m0.311s
user    0m0.275s
sys     0m0.036s

不考虑对低版本bash和对sh的兼容的情况下,用[[]]是兼容性强,而且性能比较快,在做条件运算时候,可以使用该运算符。

 

GOOD LUCK!

更多详情,请访问个人博客:https://www.wchonge.com

 

转载于:https://www.cnblogs.com/wchonge/p/8603564.html

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

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

相关文章

java循环基础知识_java基础知识—循环结构

1.while 循环语法&#xff1a;while(循环操作){循环操作&#xff1b;}特点:先判断&#xff0c;再执行&#xff1b;2. &#xff1a;用于数字比较 比较的是地址equals: 用于字符串比较 比较的是字符3.do-while语法&#xff1a;do{循环操作&#xff1b;}while(循环条件)&#xff…

android文件读写

public class service { private Context context;//引入上下文对象&#xff0c;要使用其中的方法openFileOutput public service(Context context) { super(); this.context context; } public void save(String filename,String content)throws Exception//抛出异…

接口的声明

C#中咩有多继承&#xff0c;为了解决多继承接口 什么是接口   接口可以理解为对一组方法声明进行统一命名&#xff0c;但是这些方法没有提供任何实现&#xff0c;也就是说&#xff0c;吧一组方法声明在一个接口中 然后继承于该接口的类都需要实现这些接口。 注意&#xff1a;…

C51编程在不同内存空间(data xdata bdata)定义变量的注意事项

1、data区空间小,所以只有频繁用到或对运算速度要求很高的变量才放到data区内,比如for循环中的计数值。 2、data区内最好放局部变量。 因为局部变量的空间是可以覆盖的&#xff08;某个函数的局部变量空间在退出该函数是就释放,由别的函数的局部变量覆盖&#xff09;,可以提高内…

java 类调用情况_java 如何调用类?情况如下

本人目录如下&#xff1a;在surge目录下有一个java文件想创建一个LBChart2DFrameDemo对象&#xff0c;不知道如何创建&#xff1f;。注意&#xff1a;LBChart2DFrameDemo使用了Chart2D.jar包中内容。这个目录ClsChart2D尚未加在...本人目录如下&#xff1a;在surge目录下有一个…

BZOJ1085: [SCOI2005]骑士精神

【传送门&#xff1a;BZOJ1085】 简要题意&#xff1a; 有一个5*5的棋盘&#xff0c;棋盘上有12个白棋子&#xff0c;12个黑棋子&#xff0c;和一个空格&#xff0c;每只棋子只能按照马走日的规则移动&#xff0c;求出最少步数达到以下状态 题解&#xff1a; DFSA* DFS很容易做…

猎豹网校 java_猎豹网校Java 零基础入门 JAVA基础视频教程(精制)

00.NetBeans_下载和安装.mp4 01.Java_语言概述.mp402.Java标识符和关键字.mp403.Java_变量和基本数据类型.mp404.Java_简单数据类型转换和类包装.mp405.Java_算术运算符表达式.mp406.Java_关系运算符和逻辑运算符.mp407.Java_位_赋值_条件运算符.mp408.Java_基本语句和跳转语句…

获取实体表相关信息

ClassMetadata meta session.getSessionFactory().getClassMetadata(clazz);//实体名称String entityName meta.getEntityName();//主键名称String pkName meta.getIdentifierPropertyName();转载于:https://blog.51cto.com/javaworker/736018

软测第二周作业WordCount

一、Github地址: https://github.com/duwei1996/wc 二、PSP2.1表格 PSP2.1 PSP阶段 预估耗时 &#xff08;分钟&#xff09; 实际耗时 &#xff08;分钟&#xff09; Planning 计划 3030 Estimate 估计这个任务需要多少时间 3030 Development 开发 540900 Analysis …

hook java android_Android Hook Java的的一個改進版本

Hook Java的的一個改進版本《注入安卓進程&#xff0c;並Hook java世界的方法》這篇好文相信大家都看這&#xff0c;里面所提到的方法估計大家也都試過。不過里面的所用的方法&#xff0c;我發現有兩個可以改進的地方。改進點一&#xff1a;更簡單地修改java方法為本地方法.../…

VB6转换C#2010函数替换

VB6转换C#2010函数替换 VB6 ---------------->C#2010 1、InStr(strKey, " ")-->strKey.IndexOf(" ") InStr([start, ]string1, string2[, compare]) 返回指定一字符串在另一字符串中最先出现的位置。在字符串string1中&#xff0c;从start开始找stri…

C#读写文本文件

C#中读写文本文件.txt文件既可以用File类也可用StreamReader、StreamWrite类。这两种方法都需要引用using System.IO命名空间。 下面分别给出例子&#xff1a; 1.File类写入文本文件&#xff1a; 1 private void btnTextWrite_Click(object sender, EventArgs e)2 …

java redirect 跨域_如何解决跨域重定向携带参数的问题?不使用将参数拼接在重定向url末尾的方式...

如何解决跨域重定向携带参数的问题&#xff1f;不使用将参数拼接在重定向url末尾的方式需求&#xff0c;项目A在服务器A上&#xff0c;需要重定向到服务器B上项目B&#xff0c;并且需要携带参数&#xff0c;参数对用户不可见&#xff0c;所以不可以将参数拼接在重定向url后面&a…

RichTextBox的使用

WPF里面虽然很多形式上跟Winform一样&#xff0c;但是控件的使用上面还是会有很多诧异。RichTextBox就是一个例子&#xff0c;是的&#xff0c;在WPF里面对这个控件可以做很多Winform很难做的效果出来。比如在对RichTextBox插入图片&#xff0c;winform时代除了用复制粘贴这种借…

前端自动化测试工具:SlimerJS、phantomJS 和 CasperJS

对于富客户端的 Web 应用页面&#xff0c;自动登录、页面修改、抓取页面内容、屏幕截图、页面功能测试…面对这些需求&#xff0c;使用后端语言需要花费不少的精力才能实现。此时 SlimerJS、phantomJS 或 CasperJS 或许是更好的一种选择。 一、PhantomJS 和 SlimerJS PhantomJS…

java 封装 继承 堕胎_Java的继承、封装和多态

一、继承继承就是子类继承父类的特征和行为&#xff0c;使得子类对象(实例)具有父类的实例域和方法&#xff0c;或子类从父类继承方法&#xff0c;使得子类具有父类相同的行为。继承的特性子类拥有父类非 private 的属性、方法。子类可以拥有自己的属性和方法&#xff0c;即子类…

HTML5学习笔记简明版(4):新元素之video,audio,meter,datalist,keygen,output

video 通过<video>标签&#xff0c;我们可以抛弃最近不怎么讨好的Flash&#xff0c;直接在页面中播放视频文件。视频文件自然是最符合语义化的文件格式&#xff0c;但该元素标签同样支持音频与图片。 过去(及目前)&#xff0c;我们通常要使用类似下面这样繁冗丑陋的代码来…

P2782 友好城市

题目描述 有一条横贯东西的大河&#xff0c;河有笔直的南北两岸&#xff0c;岸上各有位置各不相同的N个城市。北岸的每个城市有且仅有一个友好城市在南岸&#xff0c;而且不同城市的友好城市不相同。每对友好城市都向政府申请在河上开辟一条直线航道连接两个城市&#xff0c;但…

五个在线图形工具创建简单的设计元素

有很多网站可以为图形元素生成提供服务&#xff0c;但获得非常好的工具并不容易。这就是为什么我共享五个在线的图形工具的原因 Logotype Maker 这是一个简单而自由的做标志的Web工具&#xff0c;它可以帮助您创建一个标志 BgPatterns BgPatterns按几次按键&#xff0c;做背景图…

java shape类_Java——Shape类

Description定义一个形状类Shape&#xff0c;提供计算周长getPerimeter()和面积getArea()的函数定义一个子类正方形类Square继承自Shape类&#xff0c;拥有边长属性&#xff0c;提供构造函数&#xff0c;能够计算周长getPerimeter()和面积getArea()定义一个子类长方形类Rectang…