Linux中shell脚本解析及课后习题解答----工坊学习记录--5.2

一、shell脚本

 

1.什么是shell脚本

 shell脚本并不能作为正式的编程语言,因为它是在Linux的shell中运行的,所以称为shell脚本。事实上,she脚本就是一些命令的集合。

 

1.1 shell脚本的创建和执行

先编写第一个shell脚本,如图
在这里插入图片描述
执行脚本第一种,如图:
在这里插入图片描述
 
第二种:
在这里插入图片描述
使用该方法运行shell脚本的前提是脚本本身有执行权限,所以需要给脚本加一个x权限。另外,使用sh命令执行一个shell脚本时,可以加-x选项来查看这个脚本的执行过程,这样有利于我们调试这个脚本。如下所示:
在这里插入图片描述
 

1.2 命令 date

用法如下:

  • date +%Y:表示以四位数字格式打印年份。
  • date +%y:表示以两位数字格式打印年份。
  • date +%m:表示月份。
  • date +%d:表示日期。
  • date +H:表示小时。
  • date +%M:表示分钟。
  • date +%S:表示秒。
  • date +w:表示星期。结果显示o则表示周日。

示例:
在这里插入图片描述
在脚本中会用到一天前的日期,如下所示:
在这里插入图片描述
或者一小时前,如下:
在这里插入图片描述
甚至一分钟前,如下:
在这里插入图片描述
 

2. shell脚本中的变量

编写第一个与变量有关的脚本,如下:
在这里插入图片描述

本例中使用到了反引号,它的作用是将引号中的字符串当成shell命令执行,返回命令的执行结果。d和d1在脚本中作为变量出现。
执行:
在这里插入图片描述
 

2.1 数学运算

示例:
在这里插入图片描述
数学计算要用[ ]括起来,并且前面要加符号$。该脚本的结果如下:
在这里插入图片描述
 

2.2 和用户交互

示例:
在这里插入图片描述
read命令用于和用户交互,它把用户输入的字符串作为变量值。该脚本的执行过程如下:
在这里插入图片描述
 

2.3 shell脚本预设变量

shell脚本在执行时,后面可以跟一个或者多个参数。比如下面的脚本:
在这里插入图片描述
执行:
在这里插入图片描述
本例中,$1和$2的值就是在执行时分别输入的1和2,$1就是脚本的第一个参数,$2是脚本的第二个参数,以此类推。当然一个shell脚本的预设变量是没有限制的。

还有一个$0,它代表脚本本身的名字。我们不妨把脚本修改一下,如下所示:
在这里插入图片描述
执行:
在这里插入图片描述
 

3. shell脚本中的逻辑判断

在shell脚本中,我们同样可以使用if逻辑判断。
 

3.1 不带 else

格式如下:

if 判断语句;then
command
fi

示例:
在这里插入图片描述
if1.sh中出现了((a<60))这样的形式,这是shell脚本中特有的格式,只用一个小括号或者不用都会报错,请记住这个格式。还会用另外一种格式,后面会介绍到。
执行:
在这里插入图片描述
 

3.2 带有 else

格式如下:
if 判断语句;then
command
else
command
fi
示例:
在这里插入图片描述
执行:
在这里插入图片描述
 

3.3 带有 elif

格式如下:

if 判断语句1;then
command
elif 判断语句2;then
command
else
command
fi
示例:
在这里插入图片描述
这里的&&表示“并且”的意思,当然也可以使用||表示“或者”。
执行:
在这里插入图片描述
判断数值大小除了可以用(( ))的形式外,还可以使用[ ]。但是不能使用>、<、=这样的符号了,要使用-lt(小于)、-gt(大于)、-le(小于或等于)、-ge(大于或等于)、-eq(等于)、-ne(不等于)。下面阿铭就以命令行的形式简单比较一下,不再写shel脚本。示例:
下面是在if语句中使用88和|的情况,示例代码如下:在这里插入图片描述
下面是在if语句中使用&&和| |的情况,示例代码如下:
在这里插入图片描述
 

3.4 和文档相关的判断

shel脚本中 if 还经常用于判断文档的属性,比如判断是普通文件还是目录,判断文件是否有读、写、执行权限等。if 常用的选项有以下几个。

  • -e:判断文件或目录是否存在。
  • -d:判断是不是目录以及是否存在。
  • -f:判断是不是普通文件以及是否存在。
  • -r:判断是否有读权限。
  • -w:判断是否有写权限。
  • -x:判断是否可执行。
    使用 if 判断时的具体格式如下:
    if [-e filename];then
    command
    fi

示例:
在这里插入图片描述
因为/home/是目录而非文件,所以并不会显示ok。其他示例如下所示:
在这里插入图片描述
 

3.5 case逻辑判断

在shell脚本中,除了用if来判断逻辑外,还有一种常用的方式—case。其具体格式如下:
case 变量 in
value1)
command
;;
value2)
command
;;
value3)
command
;;
*)
command
esac
上面的结构中,不限制value的个数,*代表其他值。写一个判断输入数值是奇数还是偶数的脚本,如下所示:
在这里插入图片描述

脚本中的$a的值为1或0,执行:
在这里插入图片描述
 

4. shell 脚本中的循环

shell脚本可以算是一种简易的编程语言了,脚本中的循环也是不能缺少的。常用到的循环有for循环和while循环,下面我们就分别介绍一下这两种循环结构。

 

4.1 for循环

示例:
在这里插入图片描述
脚本中的seq1 5表示从1到5的一个序列。执行:
在这里插入图片描述
格式:
for 变量名 in 循环的条件;do
command
done

这里“循环的条件”可以是一组字符串或者数字(用一个或者多个空格隔开),也可以是一条命令的执行结果
在这里插入图片描述
“循环的条件”还可以引用系统命令的执行结果(如seq 1 5),但必须用反引号括起来。示例命令如下:
在这里插入图片描述
 

4.2 while 循环

阿铭常常用while循环来编写死循环的脚本,用于监控某项服务。while循环的格式也很简单,如下所示:
while 条件;do
command
done

示例、执行 脚本如下:
在这里插入图片描述
另外,可以用一个冒号代替循环条件,这样可以做到死循环。示例代码如下:
while :;do
command
sleep3
done
 

5. shell 脚本中的函数

shell脚本中的函数就是先把一段代码整理到一个小单元中,并给这个小单元命名,当用到这段代码时直接调用这个小单元的名字即可。有时候脚本中的某段代码总是重复使用,如果写成函数,每次用到时直接用函数名代替即可,这样不仅节省时间还节省空间。

示例、执行如下:
在这里插入图片描述
func.sh中的sum()为自定义的函数。在shell脚本中函数的格式如下:

function 函数名()
{
command1
command2
}

值得注意的是,在shell脚本中,函数一定要写在最前面,不能出现在中间或者最后。因为函数是要被调用的,如果还没有出现就被调用,肯定会出错。

 

6. shell 脚本中的中断和继续

在shell脚本循环的过程中,我们难免会遇到一些特殊需求,比如当循环到某个地方时需要做一些事情,这时候很有可能需要退出循环,或者跳过本次循环,这样的需求如何实现呢?

 

6.1 break

首先有一点需要明白,break用在循环中,不管是for或者while都可以。在脚本中使用它,表示退出该层循环。之所以说层,是因为有时我们会用到嵌套循环,大循环里面还有小循环,而break仅仅是退出那一层循环,它的上层循环不受影响。下面写一个break的示例,如下所示:

在这里插入图片描述
脚本中,本意是要把1~5数值赋予i,当i等于3时,会跳出循环,后面的4和5都不会再执行了。该脚本的执行结果如下:
在这里插入图片描述
 

6.2 continue

continue也是使用在循环中的,但和break不同的是,当在shell脚本中遇到continue时,结束的不是整个循环,而是本次循环。具体示例如下:
在这里插入图片描述
当i等于3的时候,出现了continue,所以结束本次循环,continue后面的语句不再执行,继续下一次循环。

 

6.3 exit

exit,它的作用范围更大,直接退出整个shell脚本。示例脚本如下:
在这里插入图片描述
 
 

二、课后习题

(1)shell脚本中,怎么把某一行当作注释?
答:在某一行前加#号

(2)如何执行一个shell脚本呢?
答: chmod +x 1.sh;或者./1.sh

(3)为了方便管理,我们约定把shel脚本都放到哪个目录下?
答:放到 /usr/local/sbin/下

(4)为了更好地调试shel脚本,我们可以加哪个选项来观察shell脚本的执行过程?
答: 使用bash -x 1.sh

(5)使用date命令打印5天前的日期。要求:日期格式为xxxx-xx-xx。
答:date -d “-5 day” +%F

(6)请指出下面这个脚本的问题出在哪里。
#!/bin/bash
a = 1
b = 2
echo $a,$b

答:赋值变量值的时候,带了空格

(7)在shell脚本中如何使用数学运算?请举例说明。
答:
a=2; b=4
c=[[a+$b]
echo $c

(8)shell脚本中的哪个命令可以实现脚本和用户交互?怎么使用?
答:
read -p
例如
read -p “Please input a number” n
这样会把用户输入的内容作为n这个变量的值

(9)在shell中如何进行大小或者等于判断?
答:大于 -gt 小于是 -lt 等于是 -ne 大于等于是 -ge 小于等于是 -le

(10)在shel脚本中,用什么符号表示“并且”?用什么符号表示“或者”?
答:
&& 并且
| | 或者
(11)在shell脚本中,case逻辑判断的结构是什么样的?
答:
case 变量 in
value1)
command
;;
value2)
command
;;
value3)
command
;;
*)
command
esac

(12)列举shell脚本中常用的循环结构。
答:
for a in … ; do … ; done
while …; do …; done

(13)she脚本中函数的作用是什么?函数结构是什么样的?
答:
函数可以理解成shell脚本中一个小代码单元,当要用到这段代码时直接调用函数名即可,从而避免重复书写这段代码,提高代码书写效率和质量。
函数的结构为:
function 函数名 ()
{
command1
command2
}

(14)编写一个shell脚本,在一个目录下的所有文件(不含目录)的文件名后面加“.bak”。
答:
#! /bin/bash

for f in find .type f
do
mv $f $f.bak;
done

(15)编写一个shell脚本,将当前目录下大于100KB的文件全部移动到/tmp/目录下。
答:
for f in find . -type f -size +100k;
do
mv $f /tmp/;
done

(16)编写一个shell脚本,获取本机的HOSTNAME、IP地址以及DNS地址。

(17)编写两个小脚本,验证break和continue在循环中的作用。
答:如图
在这里插入图片描述

在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章