运维基础之 shell编程

本文介绍shell脚本的基础知识,包括shell脚本的概念、格式要求、用途及如何创建、调试脚本等内容。此外还讲解了变量类型、条件语句、循环语句及函数定义等关键知识点。

shell脚本基础

shell脚本:
包含一些命令或声明,并符合一定格式的文本文件
格式要求:首行shebang机制
#!/bin/bash
#!/usr/bin/python
#!/usr/bin/perl
shell脚本的用途有:
自动化常用命令
执行系统管理和故障排除
创建简单的应用程序
处理文本或文件

创建shell脚本

第一步:使用文本编辑器来创建文本文件
第一行必须包括shell声明序列:#!
#!/bin/bash
添加注释
注释以#开头
第二步:运行脚本
给予执行权限,在命令行上指定脚本的绝对或相对路径
直接运行解释器,将脚本作为解释器程序的参数运行

批量执行脚本

1、写个简单脚本

[root@centos7 html]# vim  /data/scripts/test1.sh
#!/bin/bash
echo you always hear the terrible ones were terrible babies!

2、搭建httpd服务
3、把脚本放在共享文件夹里面

[root@centos7 html]# ls
centos  index.html  test1.sh
[root@centos7 html]# pwd
/var/www/html

4、用curl命令访问用bash执行

curl http://172.20.131.96/test1.sh |bash

脚本调试

检测脚本中的语法错误

bash -n /path/to/some_script

调试执行

bash -x /path/to/some_script

局部变量和环境变量

根据变量的生效范围等标准划分下面变量类型:
局部变量:生效范围为当前shell进程;对当前shell之外的其它shell进程,包括当前shell的子shell进程均无效
环境(全局)变量:生效范围为当前shell进程及其子进程
本地变量:生效范围为当前shell进程中某代码片断,通常指函数
位置变量:$1, 2,...来表示,用于让脚本在脚本代码中调用通过命令行传递给它的参数特殊变量:2, ...来表示,用于让脚本在脚本代码中调用通过命令行传递给它的参数 特殊变量:2,...?, $0, $*, $@, KaTeX parse error: Expected 'EOF', got '#' at position 1: #̲,$

例如:演示局部变量不能继承
1、用pstree -p 命令

在这里插入图片描述

2、然后echo $$ 查看自己当前的子进程号

[root@centos7 html]# echo $$
8471

3、定义一个变量

NAME123=mm

查看已经在当前子进程生效

[root@centos7 html]# NAME123=mm
[root@centos7 html]# echo $NAME123
mm

4、运行bash命令,发现之前的变量没有了

[root@centos7 html]# bash
[root@centos7 html]# echo $NAME123

[root@centos7 html]# 

5、echo $$查看自己当前的子进程号

[root@centos7 html]# echo $$
9779

6、exit退回到原来的进程,发现变量又回来了,所以局部变量不能继承

备注:expor NAME123 升级为环境变量,可以继承
[root@centos7 html]# export NAME123
[root@centos7 html]# NAME123=mmd
[root@centos7 html]# bash
[root@centos7 html]# echo $NAME123
mmd

位置变量

位置变量:在脚本代码中调用通过命令行传递给脚本的参数
$1, $2, …:对应第1、第2等参数,shift [n]换位置
$0: 命令本身
$: 传递给脚本的所有参数,全部参数合为一个字符串
$@: 传递给脚本的所有参数,每个参数为独立字符串
$#: 传递给脚本的参数的个数
$@ $
只在被双引号包起来的时候才会有差异
set – 清空所有位置变量

异或

异或的两个值,相同为假,不同为真
例如:

[root@centos7 html]# i=10
[root@centos7 html]# j=12
[root@centos7 html]# i=$[i^j]  i的值变成了第三个数(i值和j值异或得到第三个数)
[root@centos7 html]# j=$[i^j]  j的值变成了i值(第三个数跟j的值异或得到i的值)
[root@centos7 html]# i=$[i^j]  i的值变成了j值(第三个数跟i异或得到j的值)
[root@centos7 html]# echo $i
12
[root@centos7 html]# echo $j
10
  • && 代表条件性的AND THEN
  • || 代表条件性的OR ELSE
    示例:

grep -q no_such_user /etc/passwd || echo ‘No such user’
No such user
ping -c1 -W2 station1 &> /dev/null
&& echo “station1 is up”
|| (echo ‘station1 is unreachable’; exit 1)
station1 is up

if 语句

多分支
if 判断条件1; then
条件为真的分支代码
elif 判断条件2; then
条件为真的分支代码
elif 判断条件3; then
条件为真的分支代码
else
以上条件都为假的分支代码
fi
逐条件进行判断,第一次遇为“真”条件时,执行其分支,而后结束整个if语句

  • 使用read命令来接受输入
    -p 指定要显示的提示
    -s 静默输入,一般用于密码
    -n N 指定输入的字符长度N
    -d ‘字符’ 输入结束符
    -t N TIMEOUT为N秒
    read 从标准输入中读取值,给每个单词分配一个变量
    所有剩余单词都被分配给最后一个变量
    read -p “Enter a filename: “ FILE
    例如1:输出分数
#!/bin/bash
read -p "请输入一个你的分数: " SHUZI
if [ $SHUZI -lt 60 ];then
         echo "nonono"
elif [ $SHUZI -lt 80 ];then
         echo "sososo"
elif [ $SHUZI -le 100 ];then
         echo "good"
else
         echo "please error"
fi

例如2、检查磁盘占用率

#!/bin/bash
USED=`df |sed -nr '/\/dev\/sd/s#.* ([0-9]+)% .*#\1#p'|sort -n|tail -1`
if [ $USED -lt 50 ];then
      echo "还有内存"
else
      echo "error"
fi

case语句

例:

#!/bin/bash
cat <<EOF
1、烤鸭
2、炸酱面
3、猪蹄
4、卤煮
EOF
read -p "choose a men(1.2.3.4)>>>>>> " MENU
case $MENU in
1)
    echo price is 100
    ;;
2|4)
    echo price is 25
    ;;
3)
    echo price is 28
    ;;
*)
    echo "input error"
esac

加个while循环

#!/bin/bash
cat <<EOF
1、烤鸭
2、炸酱面
3、猪蹄
4、卤煮
EOF
PRICE=0
read -p "choose a men(1.2.3.4.5)>>>>>> " MENU
while [ $MENU != 5 ];do
case $MENU in
1)
    echo price is 100
    let PRICE+=100
    ;;
2|4)
    echo price is 25
    let PRICE+=25
    ;;
3)
    echo price is 28
    let PRICE+=28
    ;;
*)
    echo "input error"
esac
read -p "choose a men(1.2.3.4.5)>>>>>> " MENU
done
echo "总价格是$PRICE"

for循环

例:打印1+到100的和

sum=0;for i in {1..100};do let sum+=i;done;echo $sum

while循环

例:打印1+到100的和

sum=0;i=1;while [ $i -le 100 ];do let sum+=i;let i++;done;echo sum=$sum

在函数中定义局部变量的方法

local NAME=VALUE

定义函数

函数由两部分组成:函数名和函数体

help function
语法一:
f_name (){
...函数体...
}
语法二:
function f_name {
...函数体...
}
语法三:
function f_name () {
...函数体...
}

定位函数文件并载入shell的格式:

. filename 或 source filename
现在对函数做一些改动后,需要先删除函数,使其对shell不可用。使用unset命令完成删除函数
示例:
unset findit
再键入set命令,函数将不再显示
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值