您的位置:首页 > 运维架构 > Shell

第十二章:shell脚本

2020-03-29 13:18 706 查看

一、什么是shell脚本

把所有操作都记录到一个文档中,然后去调用文档中的命令,这个文档就是shell脚本。Shell脚本能帮助我们很方便地管理服务器,因为我们可以指定一个任务计划,定时去执行某个shell脚本以满足需求。在正式编写shell脚本之前,建议自定义的脚本都放在/usr/local/sbin/目录下:一是可以更好地管理文档;二是以后接管你工作的管理员都知道自定义脚本放在那里,方便维护。

1.shell脚本的创建和执行

编写第一个shell脚本:

①sh命令:

 -x:查看这个脚本的执行过程。

②./ 这个格式。(使用该方法运行shell脚本的前提是有脚本本身的执行权限):

2.命令date

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

现在:

之前:

 

二、shell脚本中的变量

如果脚本中多次出现某一个命令或路径,而你觉得路径不对想修改一下,就得一个一个修改,或者使用批量修改替换的命令修改。这样就很麻烦,变量就是用来解决这个问题的。
格式:变量名=变量的值
下面编写第一个与变量相关的脚本:

1.数学运算

数学计算要用[ ]括起来,并且前面要加符号$。

 

2.和用户交互

read命令用于和用户交互,它把用户输入的字符串作为变量值:

 

加上-x选项看看执行过程:

3.shell脚本预设变量

/etc/init.d/iptables restart 命令前面的/etc/init.d/iptables其实就是一个shell脚本。脚本后面为什么可以跟restart字符串呢?这就设置shell脚本的预设变量。实际上,shell脚本在执行时,后面可以跟一个或者多个参数:

注意$1和$2就是shell脚本的预设变量。$1和$2的值就是执行时分别输入的1和2,$1就是脚本的第一个参数,$2是脚本的第二个参数,以此类推。预设变量是没有限制的。
还有一个$0,代表脚本本身的名字,不妨把脚本修改一下:

三、shell脚本中的逻辑判断

1.不带else

格式:

if (判断语句);then

command

fi

2.带有else

格式:

if (判断语句);then

command

else

command

fi

3.带有elif

格式:

if (判断语句1);then

command

elif (判断语句2);then

command

else

command

fi

这里的&&表示“并且”的意思,当然也可以使用||表示“或者”。

判断数值大小除了可以用(())形式外,还可以使用[ ]。但是不能使用大于等于符号了,要使用-lt(小于)、-gt(大于)、-le(小于或等于)、-ge(大于或等于)、-eq(等于)、-ne(不等于):
# a=10; if [$a -lt 5]; then echo ok; fi
# a=10; if [$a -gt 5]; then echo ok; fi
ok
# a=10; if [$a -ge 10]; then echo ok; fi
ok
# a=10; if [$a -eq 10]; then echo ok; fi
ok
# a=10; if [$a -ne 10]; then echo ok; fi

下面是在if语句中使用&&和||的情况:
# a=10; if [$a -lt 1] || [$a -gt 5]; then echo ok; fi
ok
# a=10; if [$a -gt 1] && [$a -le 10]; then echo ok; fi
ok

4.和文档相关的判断

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

示例代码如下:
# if [-d /home/]; then echo ok; fi
ok
# if [-f /home/]; then echo ok; fi
因为/home/是目录而非文件,所以并不会显示ok。其他示例如下:
# if [-f /root/test.txt]; then echo ok; fi
ok
# if [-r /root/test.txt]; then echo ok; fi
ok
# if [-w /root/test.txt]; then echo ok; fi
ok
# if [-x /root/test.txt]; then echo ok; fi
# if [-e /root/test.txt]; then echo ok; fi

5.case逻辑判断

格式:
case 变量 in
value1)
command
;;
Value2)
command
;;
Value3)
command
;;
*)
command
;;
esac

判断输入数值是奇数还是偶数的脚本:


 

四、shell脚本中的循环

1.for循环

格式:

for 变量名 in 循环的条件;do

command

` done

2.while循环

有人常用while循环来编写死循环的脚本,用来监控某项服务。

格式:

while 条件 ; do

command

done

==
用一个冒号代表循环条件,这样可以做到死循环:

五、shell脚本中的函数

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

func.sh 中的sum()为自定义函数。在shell脚本中函数格式如下:
function 函数名()
{
command1
command2
}
需要注意的是,在shell脚本中,函数一定要写在最前面。因为函数是要被调用的,如果还没有出现就被调用,肯定会出错。

六、shell脚本中的终端和继续

1.break

break用在循环中,不管是for还是while都可以。在脚本中使用它,表示退出该层循环。之所以时层,是因为我们有时候用的嵌套循环,大循环里面还有小循环,而break只是退出那一层循环,他的上层循环不受影响。
 

2.continue

continue也是用在循环中的,和break不同的是,当在shell脚本中遇到continue时,结束的不是整个循环,而是本次循环。

3.exit

与前两个功能类似,但是它的作用范围更大,直接退出整个shell脚本。

  • 点赞
  • 收藏
  • 分享
  • 文章举报
梦由己造 发布了11 篇原创文章 · 获赞 0 · 访问量 230 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: