shell脚本编程

跟風遠走 提交于 2019-12-04 17:57:26

Shell 脚本,是一种为 shell 编写的脚本程序。

Shell echo命令

使用echo可以实现更复杂的输出格式控制。

1.显示普通字符串:

echo "It is a test"

这里的双引号完全可以省略,以下命令与上面实例效果一致:

echo It is a test

2.显示转义字符

echo "\"It is a test\""

结果将是:

"It is a test"

同样,双引号也可以省略

3.显示变量

read 命令从标准输入中读取一行,并把输入行的每个字段的值指定给 shell 变量

#!/bin/sh
read name 
echo "$name It is a test"

以上代码保存为 test.sh,name 接收标准输入的变量,结果将是:

[root@www ~]# sh test.sh
OK                     #标准输入
OK It is a test        #输出

4.显示换行

echo -e "OK! \n" # -e 开启转义
echo "It is a test"

输出结果:

OK!

It is a test

5.显示不换行

#!/bin/sh
echo -e "OK! \c" # -e 开启转义 \c 不换行
echo "It is a test"

输出结果:

OK! It is a test

6.显示结果定向至文件

echo "It is a test" > myfile

7.原样输出字符串,不进行转义或取变量(用单引号)

echo '$name\"'

输出结果:

$name\"

8.显示命令执行结果

echo `date`

注意: 这里使用的是反引号 `, 而不是单引号 '。

结果将显示当前日期

 

Shell printf 命令

printf 命令与 C 语言里的 printf() 几乎一致。

printf 使用引用文本或空格分隔的参数,外面可以在 printf 中使用格式化字符串,还可以制定字符串的宽度、左右对齐方式等。默认 printf 不会像 echo 自动添加换行符,我们可以手动添加 \n。

printf 命令的语法:

printf  format-string  [arguments...]

参数说明:

  • format-string: 为格式控制字符串
  • arguments: 为参数列表。

实例如下:

$ echo "Hello, Shell"
Hello, Shell
$ printf "Hello, Shell\n"
Hello, Shell
$

接下来,我来用一个脚本来体现printf的强大功能:

#!/bin/bash
printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg  
printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234 
printf "%-10s %-8s %-4.2f\n" 杨过 男 48.6543 
printf "%-10s %-8s %-4.2f\n" 郭芙 女 47.9876

执行脚本,输出结果如下所示:

姓名     性别   体重kg
郭靖     男      66.12
杨过     男      48.65
郭芙     女      47.99

%s %c %d %f都是格式替代符

 

#!/bin/bash
# format-string为双引号
printf "%d %s\n" 1 "abc"
# 单引号与双引号效果一样 
printf '%d %s\n' 1 "abc" 
# 没有引号也可以输出
printf %s abcdef
# 格式只指定了一个参数,但多出的参数仍然会按照该格式输出,format-string 被重用
printf %s abc def
printf "%s\n" abc def
printf "%s %s %s\n" a b c d e f g h i j
# 如果没有 arguments,那么 %s 用NULL代替,%d 用 0 代替
printf "%s and %d \n"

执行脚本,输出结果如下所示:

1 abc
1 abc
abcdefabcdefabc
def
a b c
d e f
g h i
j  
 and 0

 

程序流程控制,实际上就是改变程序的执行顺序。程序在执行过程中若流程被改变,就可能导致输出不同,因此利用这一特性就能够实现程序执行结果的控制。程序流程控制可分为“选择”和“循环”这两类,在需要根据实际需求的不同实现不同的输出时,就可以改变程序的执行流程。

(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+BC的映射方式。其他常见的运算还有减法、乘法以及开方等,它们都属于一元运算,本质上是AB形式的映射。

算术运算由运算符和操作数组成,由它们映射成一个新的量,下面是一个没有包括任何变量扩展的算术例子。

在算术中,运算符为加号,其操作数为3 和6,在做这个运算时并不需要进行变量展开就可以直接得到结果为9。而在一些需要包含变量以及变量扩展时,在运算之前则需要扩展变量,如下例所示。

由于存在变量扩展,因此在运算前需要扩展变量。其操作流程是:若变量 i 的值不存在,则${i:-3}展开后其值为3,之后再与6做加法运算,其最后的结果为9。而若变量i存在值,则在扩展后取i的值,然后再与6相加。

在求值运算过程中,由于变量值不存在或者当其值为空时,该变量的值默认为0。

在一个存在变量的算术运算式中,在引用变量的值之前需要先定义,然后才可以引用。若变量没有赋予值,则在引用时视它为0。

事实上,乘除法运算与加减法也非常类似,只要将运算符修改并注意在进行除法运算时除数与被除数的一些问题就可以了。

如下:

 


作者:MMMHUHU
链接:http://www.imooc.com/article/276808
来源:慕课网
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!