【学习】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 有很多种,国内通常使用 ...
随机推荐
- 网络协议 2 - IP 是怎么来,又是怎么没的?
了解完网络协议,我们会发现,网络通信的五层模型里,有两个很重要的概念:IP 地址和 MAC 地址. 那么 IP 地址是怎么来的,又是怎么没的?MAC 地址与 IP 地址又有什么区别? 这回答上面问题前 ...
- java基础(一)-----java的三大特性之封装
面向对象编程有三大特性:封装.继承.多态.本文将介绍java的三大特性之封装 封装 封装从字面上来理解就是包装的意思,专业点就是信息隐藏,是指利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成 ...
- SQLServer安装和JDBC连接SQLServer
SQLServer 安装 参考链接: http://blog.csdn.net/sangjinchao/article/details/62044021?locationNum=6&fps=1 ...
- gcc编译基本用法~1
命令格式:gcc [选项] [文件名] 编译的四个阶段:-E:仅执行编译预处理: -c:仅执行编译操作,不进行连接操作:-S:将C代码转换为汇编代码: -o:指定生成的输出文件. Expiain : ...
- leetcode — pascals-triangle
import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** * Source : https://o ...
- 补习系列(5)-springboot- restful应用
一.目标 了解 Restful 是什么,基本概念及风格: 能使用SpringBoot 实现一套基础的 Restful 风格接口: 利用Swagger 生成清晰的接口文档. 二.Restful 入门 什 ...
- C++STL模板库序列容器之vector
目录 STL之Vecter 一丶STL简介 二丶Vector用法 1.vector容器的使用 2.vector迭代器. 3.vector中的方法. 三丶常用算法 1.常见算法中的算法方法. 2.sor ...
- Spring Boot(五):Spring Boot Jpa 的使用
在上篇文章Spring Boot(二):Web 综合开发中简单介绍了一下 Spring Boot Jpa 的基础性使用,这篇文章将更加全面的介绍 Spring Boot Jpa 常见用法以及注意事项. ...
- 原生JS forEach()和map()遍历的区别以及兼容写法
一.原生JS forEach()和map()遍历 共同点: 1.都是循环遍历数组中的每一项. 2.forEach() 和 map() 里面每一次执行匿名函数都支持3个参数:数组中的当前项item,当前 ...
- Mybatis学习(六)————— Spring整合mybatis
一.Spring整合mybatis思路 非常简单,这里先回顾一下mybatis最基础的根基, mybatis,有两个配置文件 全局配置文件SqlMapConfig.xml(配置数据源,全局变量,加载映 ...