DJ8-4 shell 语句的分类、shell 的结构性语句

news/2024/10/28 15:10:02/

目录

8.7  shell 编程

8.7.1  shell 编程的基本过程

8.7.2  实例

8.7.3  shell 程序和语句

8.8  说明性语句和功能性语句

8.8.1  说明性语句(注释行)

8.8.2  常用的功能性语句

8.9  结构性语句

8.9.1  条件语句 if

8.9.2  测试语句 test

8.9.3  多路分支语句 case…esac

8.9.4  循环语句 for…do…done

8.9.5  循环语句 while…do…done

8.9.6  循环控制语句 break 和 continue


8.7  shell 编程

8.7.1  shell 编程的基本过程

包含以下三步:

  1. 创建 shell 文件,即后缀名为 .sh 的文件
  2. 赋予 shell 文件执行权限,即使用 chmod 命令修改权限
  3. 执行 shell 文件,即在命令行调用 shell 文件

8.7.2  实例

r=4,w=2,x=1
若要rwx属性,则4+2+1=7
若要rw-属性,则4+2=6
若要r-x属性,则4+1=5

8.7.3  shell 程序和语句

shell 程序由零至多条 shell 语句构成。

shell 语句以下三大类:

  • 说明性语句:以 # 号开始到行尾的部分,不被解释执行。
  • 功能性语句:任意的 OS 命令、shell 内部命令、自编程序、其它 shell 程序名等。
  • 结构性语句:条件测试语句、多路分支语句、循环语句、循环控制语句等。             

8.8  说明性语句和功能性语句

8.8.1  说明性语句(注释行)

注释行可以出现在程序中的任何位置,既可以单独占用一行,也可以接在执行语句的后面。以 # 号开始到所在行的行尾部分,都不被解释执行。例如:

#! /bin/sh 告诉OS用哪种shell来解释执行程序
#
# 本程序说明
#
cmd1
cmd2    # cmd2的语句说明

8.8.2  常用的功能性语句

1、read 命令

read 从标准输入读入一行,并赋值给后面的变量。注意:执行 read 语句时,shell 程序将会等待你的一个标准输入,而一旦回车就代表输入结束,因此必须在一行中输入完毕。

把读入的数据全部赋给 var,语法格式如下:

read var

把读入行中的第一个参数赋给 var1,第二个参数赋给 var2,……,语法格式如下

read var1 var2 var3

如果执行 read 语句时标准输入无数据,则程序在此停留等待,直到数据的到来或被终止运行:

当变量个数和参数个数不匹配时,将会把剩下的所有参数赋给最后一个变量:

2、expr 命令

算术运算命令 expr 主要用于进行简单的整数运算,包括:加 (+)、减 (-)、乘 (\*)、整除 (/) 和求模 (%) 等操作。例如:

$ expr 12 + 5 \* 3
27$ expr 3 - 8 / 2
-1$ expr 25 % 4
1$ num=9
$ sum=`expr $num \* 6`
$ echo $sum
54

没有 expr 就不能进行算术运算:

8.9  结构性语句

结构性语句主要根据程序的运行状态、输入数据、变量的取值、控制信号以及运行时间等因素来控制程序的运行流程。主要包括以下几类语句:

  • 条件测试语句(两路分支)
  • 多路分支语句
  • 循环语句
  • 循环控制语句

无任何结构性语句的shell脚本程序是一种特例。

8.9.1  条件语句 if

语法结构:

if 表达式
then 命令表1
else 命令表2
fi     

创建 test.sh 文件:

if [ -f file1 ]
thenecho "文件file1存在"
elseecho "文件file1不存在"
fi
  • -f:如果 filename为常规文件,则为真
  • -d:如果 filename为目录,则为真
  • [ ]:和表达式两侧必须要有一个空格

执行 test.sh 文件:

初始由于没有为其赋予权限,因此执行失败,于是我们使用 chmod 命令修改其权限。

8.9.2  测试语句 test

test 语句可测试的三种对象:

  • 字符串
  • 整数
  • 文件属性

test 命令测试的条件成立时,命令返回值为真(0),否则返回值为假(非 0)

① 用法一

name="anyujin"
test $name == $1
echo $?

② 用法二

if test -f file1
thenecho "文件file1存在"
elseecho "文件file1不存在"
fi

通常把 test 简写为 [  ] :

if [ -f file1 ]

即用方括号替代了 test 语句,注意方括号和表达式之间至少要有一个空格。

8.9.3  多路分支语句 case…esac

case 字符串变量 in模式1)命令表1;;模式2)命令表2;;...*)命令表n;;
esac

检查用户输入的文件名:

# 要求输入一个命令行参数
if [ $# -ne 1 ]
thenecho "One argument must be declared."exit
fi# 检查用户输入的文件
case $1 infile1)echo "User selects file1.";;file2)echo "User selects file2.";;*)echo "You must select either file1 or file2!";;
esac

执行上述 shell 程序:

8.9.4  循环语句 for…do…done

当循环次数已知或确定时,使用 for 循环语句来多次执行一条或一组命令。循环体由语句括号 do 和 done 来限定。格式为:

for 变量名 in 单词表
do命令表
done

① 用法一

for num in "1" "3" "5"
doecho "$num"
done

② 用法二

for num in {1..5}
doecho "$num"
done

③ 用法三

# 判断并创建目录backup
if  [ ! -d $HOME/backup ]
thenmkdir $HOME/backup
fi# 修改工作路径
cd /home/envoutante/桌面# 用flist存放当前目录的所有文件
flist=`ls`# “图片18.png”
num=18# 循环flist中的所有文件
for file in $flist
do# 修改文件名mv ${file} 图片${num}.pngfile="图片${num}.png"# 复制文件到backupcp $file $HOME/backupecho "$file copied"# 计数器加一num=`expr $num + 1`
doneecho '***Back up completed***'

8.9.5  循环语句 while…do…done

语法结构为:

while 命令或表达式
do命令表
done

创建文件程序,参数 1 为文件名开头,参数 2 为创建个数:

8.9.6  循环控制语句 break 和 continue

break 语句从包含该语句的最近一层循环中跳出一层,break  n 则跳出 n 层;

continue 语句则马上转到最近一层循环语句的下一轮循环上,continue n 则转到最近 n 层循环语句的下一轮循环上。


http://www.ppmy.cn/news/432665.html

相关文章

投资框架2018

投资框架2018 2018-02-09 李国飞 李国飞哲学与投资笔记 说明:本文2018年2月3日演讲于高礼价值投资研习班深圳第五次课程,算是我多年思考投资的一个总结。这个投资框架是探讨投资决策、公司基本面和股价这三者的内在变化以及相互间的联系和影响&#xf…

MATLAB小波图像融合处理

目 录 摘 要 1 Abstract 1 1、 绪论 2 1.1 课题开发背景 2 1.1.1 图像融合的定义 2 1.1.2 手动配准与图象融合 2 1.1.3 图象融合研究的发展现状和研究热点 3 1.2 课题设计要求 4 2、MATLAB程序设计 5 2.1 MATLAB软件简介 5 2.2 MATLAB软件窗口环境 7 2.3 M语言编程 8 3、图像融…

“超限”之下,OLED迎来最好的反击

文丨佘凯文 来源丨智能相对论 自OLED进入电视舞台以来,关于“OLED已输”,“OLED将死”或是“OLED最多还有5年寿命”等等言论大量充斥各个媒介,与之相反的则是QLED概念的大行其道“广受追捧”。 一场“OQ”之间的争夺在电视机市场持续进行着…

(附源码)spring boot社区居民健康档案管理系统 毕业设计 220940

springboot 社区居民健康档案管理系统 摘 要 目前随着人们对健康认识的不断深入,健康观念也正在由有病治病向无病预防的方向改变,人们开始更加注重生活的质量,追求更健康,更长寿。因此,开发一个面向个社区居民&#xf…

(附源码)Springboot社区居民健康档案管理系统 毕业设计 220940

springboot 社区居民健康档案管理系统 摘 要 目前随着人们对健康认识的不断深入,健康观念也正在由有病治病向无病预防的方向改变,人们开始更加注重生活的质量,追求更健康,更长寿。因此,开发一个面向个社区居民&#xf…

spring boot社区居民健康档案管理系统毕业设计源码220940

springboot 社区居民健康档案管理系统 摘 要 目前随着人们对健康认识的不断深入,健康观念也正在由有病治病向无病预防的方向改变,人们开始更加注重生活的质量,追求更健康,更长寿。因此,开发一个面向个社区居民&#xf…

基于Java精品酒销售管理系统设计实现(源码+lw+部署文档+讲解等)

博主介绍: ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ 🍅 文末获取源码联系 🍅 👇🏻 精…

被“宠坏”的中国消费者,最后还是导向了OLED阵营

文|曾响铃 来源|科技向令说(xiangling0815) 在屏幕这件事上,一个诡异的现象正在发生,“两伙人”像是看不到对方,在各自的世界里火拼: 一边,是互联网电视价格战白热化,正牌大厂产品…