shell脚本并不能作为正式的编程语言,因为它是在Linux的shell中运行的,所以称为shell脚本。事实上,she脚本就是一些命令的集合。
先编写第一个shell脚本,如图
执行脚本第一种,如图:
第二种:
使用该方法运行shell脚本的前提是脚本本身有执行权限,所以需要给脚本加一个x权限。另外,使用sh命令执行一个shell脚本时,可以加-x选项来查看这个脚本的执行过程,这样有利于我们调试这个脚本。如下所示:
用法如下:
示例:
在脚本中会用到一天前的日期,如下所示:
或者一小时前,如下:
甚至一分钟前,如下:
本例中使用到了反引号,它的作用是将引号中的字符串当成shell命令执行,返回命令的执行结果。d和d1在脚本中作为变量出现。
执行:
示例:
数学计算要用[ ]括起来,并且前面要加符号$。该脚本的结果如下:
示例:
read命令用于和用户交互,它把用户输入的字符串作为变量值。该脚本的执行过程如下:
shell脚本在执行时,后面可以跟一个或者多个参数。比如下面的脚本:
执行:
本例中,$1和$2的值就是在执行时分别输入的1和2,$1就是脚本的第一个参数,$2是脚本的第二个参数,以此类推。当然一个shell脚本的预设变量是没有限制的。
还有一个$0,它代表脚本本身的名字。我们不妨把脚本修改一下,如下所示:
执行:
在shell脚本中,我们同样可以使用if逻辑判断。
格式如下:
if 判断语句;then
command
fi
示例:
if1.sh中出现了((a<60))这样的形式,这是shell脚本中特有的格式,只用一个小括号或者不用都会报错,请记住这个格式。还会用另外一种格式,后面会介绍到。
执行:
格式如下:
if 判断语句;then
command
else
command
fi
示例:
执行:
格式如下:
if 判断语句1;then
command
elif 判断语句2;then
command
else
command
fi
示例:
这里的&&表示“并且”的意思,当然也可以使用||表示“或者”。
执行:
判断数值大小除了可以用(( ))的形式外,还可以使用[ ]。但是不能使用>、<、=这样的符号了,要使用-lt(小于)、-gt(大于)、-le(小于或等于)、-ge(大于或等于)、-eq(等于)、-ne(不等于)。下面阿铭就以命令行的形式简单比较一下,不再写shel脚本。示例:
下面是在if语句中使用88和|的情况,示例代码如下:
下面是在if语句中使用&&和| |的情况,示例代码如下:
shel脚本中 if 还经常用于判断文档的属性,比如判断是普通文件还是目录,判断文件是否有读、写、执行权限等。if 常用的选项有以下几个。
示例:
因为/home/是目录而非文件,所以并不会显示ok。其他示例如下所示:
在shell脚本中,除了用if来判断逻辑外,还有一种常用的方式—case。其具体格式如下:
case 变量 in
value1)
command
;;
value2)
command
;;
value3)
command
;;
*)
command
esac
上面的结构中,不限制value的个数,*
代表其他值。写一个判断输入数值是奇数还是偶数的脚本,如下所示:
shell脚本可以算是一种简易的编程语言了,脚本中的循环也是不能缺少的。常用到的循环有for循环和while循环,下面我们就分别介绍一下这两种循环结构。
示例:
脚本中的seq1 5表示从1到5的一个序列。执行:
格式:
for 变量名 in 循环的条件;do
command
done
这里“循环的条件”可以是一组字符串或者数字(用一个或者多个空格隔开),也可以是一条命令的执行结果
“循环的条件”还可以引用系统命令的执行结果(如seq 1 5),但必须用反引号括起来。示例命令如下:
阿铭常常用while循环来编写死循环的脚本,用于监控某项服务。while循环的格式也很简单,如下所示:
while 条件;do
command
done
示例、执行 脚本如下:
另外,可以用一个冒号代替循环条件,这样可以做到死循环。示例代码如下:
while :;do
command
sleep3
done
shell脚本中的函数就是先把一段代码整理到一个小单元中,并给这个小单元命名,当用到这段代码时直接调用这个小单元的名字即可。有时候脚本中的某段代码总是重复使用,如果写成函数,每次用到时直接用函数名代替即可,这样不仅节省时间还节省空间。
示例、执行如下:
func.sh中的sum()为自定义的函数。在shell脚本中函数的格式如下:
function 函数名()
{
command1
command2
}
值得注意的是,在shell脚本中,函数一定要写在最前面,不能出现在中间或者最后。因为函数是要被调用的,如果还没有出现就被调用,肯定会出错。
在shell脚本循环的过程中,我们难免会遇到一些特殊需求,比如当循环到某个地方时需要做一些事情,这时候很有可能需要退出循环,或者跳过本次循环,这样的需求如何实现呢?
首先有一点需要明白,break用在循环中,不管是for或者while都可以。在脚本中使用它,表示退出该层循环。之所以说层,是因为有时我们会用到嵌套循环,大循环里面还有小循环,而break仅仅是退出那一层循环,它的上层循环不受影响。下面写一个break的示例,如下所示:
脚本中,本意是要把1~5数值赋予i,当i等于3时,会跳出循环,后面的4和5都不会再执行了。该脚本的执行结果如下:
continue也是使用在循环中的,但和break不同的是,当在shell脚本中遇到continue时,结束的不是整个循环,而是本次循环。具体示例如下:
当i等于3的时候,出现了continue,所以结束本次循环,continue后面的语句不再执行,继续下一次循环。
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地址。