【学习】Linux Shell脚本实例之一
1.程序流程控制实例
程序流程控制,实际上就是改变程序的执行顺序。程序在执行过程中若流程被改变,就可能导致输出不同,因此利用这一特性就能够实现程序执行结果的控制。程序流程控制可分为“选择”和“循环”这两类,在需要根据实际需求的不同实现不同的输出时,就可以改变程序的执行流程。
(1)for循环语句
基于for语句的循环,基于继续执行循环或者结束循环的方式。在for执行命令前,其会先检查所要执行的列表中所指定的值是否还有未使用的,若有未使用的就赋值并执行列表,直到列表中的值全部都使用过后才退出循环。
如下是一个简单的 for 控制语句的脚本程序,其使用“星期”作为变量名,并从列表中读取值,直到读取完成后退出。
我们执行一下
说明:
第03 行,所定义的变量名为week,其值为Monday~ Sunday。
第05行,使用echo回显变量week的值。
(2)while循环语句
while循环语句结构是一种执行一系列命令的语句结构,它所执行的命令由测试条件所决定,这些条件定义语句是否继续执行。
在 while 循环语句中执行命令,若条件为真,则将过程执行一遍并回到开始处,接着再次进行条件的判断,若条件仍然是真,则接着再执行一遍,直到条件为假时才退出循环。如下是一个数值运算的while循环脚本,其实现的是数值相加运算。
执行一下看一下结果
说明:
第03和04行,声明x和sum都为整型变量并赋予初始值。
第05行,条件测试。
第06~09行,这是一个循环体,当执行遇到done后,跳到第06行处继续执行,直到条件不满足时退出循环。
第10行,输出总数值。
(3)until循环语句
与for和while循环体一样,until循环也执行一系列的命令,直到条件满足后退出循环。until循环在循环体的顶部继续判断条件,直到条件为真时结束循环,否则一直执行。
以下脚本使用until语句来实现一个简单的、不断循环的输出预设值,直到人为干预时结束循环(按Ctrl+C组合键退出)。
(4)if选择分支语句
看一下执行结果:
说明:
第03行,使用cat命令从当前目录的testwhile.sh文件中读取信息,然后通过管道传送到grep命令进行过滤。其中,^ 表示检查的关键字是该行的开始。
第04行,若所需查看的信息存在,则输出提示。
第05行,if语句结束的标记。
if语句的另外一种结构是if-then-else,这种if语句可以实现先判断,然后根据判断的结果选择执行脚本代码块,也就是说,不管条件判断的结果怎么样都有输出。如下实例的主要作用是将读取到的数值与预设值对比,然后根据对比结果执行代码。
看一下执行结果:
说明:
第03行:提示用户输入。
第04行,读取用户的输入并放到JOB变量中。
第05~10行,判断输入的值并执行对应的代码块。
(5)case选择语句
若需要判断的条件达到一定数量,仍选择使用if语句来实现,语句就会变得不易编写且代码变得沉长,同时也给日后的维护工作带来不便。
case语句的出现,在很大程度上弥补了if语句的不足,case语句允许通过条件的判断选择执行不同的代码块。但需要注意的是,case对变量的使用不是强制性的,且每条语句都以右小括号结尾,每个代码块都以两个分号结尾。
通过case结构来实现为多分支功能,可以使程序代码不但易读而且其结构更加简洁。下面使用case结构来实现一个名字检索脚本,脚本中的变量值在条件成立时就执行相应代码。脚本的命令读取输入信息,并判断是否存在所输入的信息,之后就执行相应的代码块。
对于以上的问题,可以,看如下的例子。
运行结果:
说明:
第04行,$name中的值为待测变量。
第06行,需要与待测变量值对比的预设值。
第09行,输出一个空行。
第11行,如果第05行的值与预设值都不同,则对比此处的值。
第16行,case语句结束的标记。
完成之后,将所写的代码进行保存然后退出。
2.算术运算实例
算术是数学中最古老、最基础和最初等的部分,它研究的是数的性质和运算。从数学的本质上来说,算术属于一种映射,是一种获得新变量的可能组合。而常说的从算术中所得到的新变量,其实是由算术式的运算得到的。
算术式是由运算符和操作数组成,如:3+6。其中的运算符为加号(+),而操作数为3和6,所映射得到的新量为 9。在算术式中,其可以包含变量、变量扩展。在进行算术计算前,变量会被替换,而在括号内的变量也会被展开。
3+6=9的加法运算,是一个最为常见的一元运算,在本质上是A+B→C的映射方式。其他常见的运算还有减法、乘法以及开方等,它们都属于一元运算,本质上是A→B形式的映射。
算术运算由运算符和操作数组成,由它们映射成一个新的量,下面是一个没有包括任何变量扩展的算术例子。
在算术中,运算符为加号,其操作数为3 和6,在做这个运算时并不需要进行变量展开就可以直接得到结果为9。而在一些需要包含变量以及变量扩展时,在运算之前则需要扩展变量,如下例所示。
由于存在变量扩展,因此在运算前需要扩展变量。其操作流程是:若变量 i 的值不存在,则${i:-3}展开后其值为3,之后再与6做加法运算,其最后的结果为9。而若变量i存在值,则在扩展后取i的值,然后再与6相加。
在求值运算过程中,由于变量值不存在或者当其值为空时,该变量的值默认为0。
在一个存在变量的算术运算式中,在引用变量的值之前需要先定义,然后才可以引用。若变量没有赋予值,则在引用时视它为0。
事实上,乘除法运算与加减法也非常类似,只要将运算符修改并注意在进行除法运算时除数与被除数的一些问题就可以了。
如下:
【学习】Linux Shell脚本实例之一的更多相关文章
- 学习Linux shell脚本中连接字符串的方法
这篇文章主要介绍了Linux shell脚本中连接字符串的方法,如果想要在变量后面添加一个字符,可以用一下方法: 代码如下: $value1=home $value2=${value1}"= ...
- [Linux] Shell 脚本实例(超实用)
文件操作 为文件(test.sh)增加执行权限 chmod +x test.sh 列出当前文件夹下所有文件(每行输出一个) 1 #!/bin/bash 2 dir=`ls ./` 3 for i in ...
- Linux shell脚本基础学习详细介绍(完整版)二
详细介绍Linux shell脚本基础学习(五) Linux shell脚本基础前面我们在介绍Linux shell脚本的控制流程时,还有一部分内容没讲就是有关here document的内容这里继续 ...
- Linux shell脚本基础学习详细介绍(完整版)一
Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提.1. Lin ...
- linux shell 脚本攻略学习20--awk命令入门详解
awk生于1977年,创始人有三个,分别为 Alfred Aho,Peter Weinberger, 和 Brian Kernighan,名称源于三个创始人的姓的首字母. 作用:处理文本文件. awk ...
- 详细介绍Linux shell脚本基础学习
Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提.1. Lin ...
- 学习笔记之Linux Shell脚本教程:30分钟玩转Shell脚本编程
Linux Shell脚本教程:30分钟玩转Shell脚本编程 http://c.biancheng.net/cpp/shell/
- 【学习】Linux Shell脚本编程
1.脚本的组成和执行 Linux shell脚本的结构并不复杂,其主要由变量.内部命令以及shell的语法结构和一些函数.其他命令行的程序等组成,以下是一个简单的shell脚本. #!/bin/bas ...
- 前端学习 linux —— shell 编程
前端学习 linux - shell 编程 shell 原意是"外壳",与 kernel(内核)相对应,比喻内核外的一层,是用户和内核沟通的桥梁.shell 有很多种,国内通常使用 ...
随机推荐
- GitLab 社区版 11.0.2用户管理教程
Gitlab地址:http://xx.xx.xx.xx/users/sign_in 登录之后,主界面 右上角功能按钮,分别为管理区域.新建.问题.合并请求.待办事件.个人设置 选择管理区域按钮 可以根 ...
- 程序员如何面试才能拿到offer
一.概述 面试,难还是不难?取决于面试者的底蕴(气场+技能).心态和认知及沟通技巧.面试其实可以理解为一场聊天和谈判,在这过程中有心理.思想上的碰撞和博弈.其实你只需要搞清楚一个逻辑:“面试官为什么会 ...
- 并发编程(四)—— ThreadLocal源码分析及内存泄露预防
今天我们一起探讨下ThreadLocal的实现原理和源码分析.首先,本文先谈一下对ThreadLocal的理解,然后根据ThreadLocal类的源码分析了其实现原理和使用需要注意的地方,最后给出了两 ...
- Android--加载大分辨率图片到内存
前言 在使用ImageView显示图片的时候,直接加载一个图片资源到内存中,经常会出现内存溢出的错误,这是因为有些图片的分辨率比较高,把它直接加载到内存中之后,会导致堆内存溢出的问题.这篇博客就来讲解 ...
- peewee insert 数据时报错:'buffer' object has no attribute 'translate'
错误信息: "'buffer' object has no attribute 'translate'" 场景:使用peewee insert 数据时,BlobField 字段存储 ...
- String str=null; 和String str=""的区别
1.最大的区别在于String str=null没有分配内存,String str=""分配了内存 2.String str=null 这个引用指向了一个null ,没有地址没 ...
- 以实例说明微服务拆分(以SpringCloud+Gradle)
前言 之前,我都是说了很多的关于微服务的概念,说到底,很多人看了之后会认为没有什么意思,因为没有实际的东西说明,即使每个概念都明白了,也很难赋之实践.所以这次,我来用一个实际的例子去说明,在实际的项目 ...
- leetcode — validate-binary-search-tree
import apple.laf.JRSUIUtils; /** * Source : https://oj.leetcode.com/problems/validate-binary-search- ...
- linux 防火墙详细介绍
1.其实匹配扩展中,还有需要加-m引用模块的显示扩展,默认是隐含扩展,不要使用 -m状态检测的包过滤-m state --state {NEW,ESTATBLISHED,INVALID,R ...
- [五] JavaIO之InputStream OutputStream简介 方法列表说明
InputStream 和 OutputStream 对于字节流的输入和输出 是作为协议的存在 所以有必要了解下这两个类提供出来的基本约定 这两个类是抽象类,而且基本上没什么实现,都是依赖于子类具 ...