Linux初学(九)shell 脚本

一、shell 脚本编程

1.1 简介

shell脚本就是一个文件

在这个文件中包含了要批量自动执行的命令

写shell脚本的基本规范

第一步:用vi/vim创建一个后缀是.sh的文件

第二步:在文件中写入内容

  • 第一行是:#!/bin/bash 指定程序的解释器
  • 从第二行开始是文件的正文

第三步:保存退出

第四步:给shell脚本赋权【赋予执行权限x】

第五步:执行shell脚本

vi/vim

  • vim是vi的升级版
  • 建议使用vim
  • 可能需要安装vim
  • 安装vim的方法:
    • 配置好yum源
    • 开始安装:yum install vim -y

shell脚本的注释

shell脚本中,是用#进行注释

关于脚本赋权

写法1:

        chmod +x 脚本

写法2:

        chmod 777 脚本

执行shell脚本

./脚本

案例:

#!/bin/bash

echo "Hello boys"
echo "程序开始执行....."
whoami

echo "当前用户是`whoami`"
echo "当前主机的地址是:·ip addr s ens33 | awk -F "[/ ]+" 'NR==3{print $3}'`"
# [/ ]+ 匹配一个或多个斜杠或空格字符

useradd aaa01

echo "程序执行结束....."

1.2 变量

什么是变量

值会发生变量的对象
name='tom'

  • name 是变量名
  • tom 是变量的值

定义变量

1. 定义的格式

  • 变量名=变量值 【=两边不能有空格】
  • 变量名不能用引号
  • 变量值可以用引号

2. 变量名的要求

  • 只能有数字、字母、下划线(_)
  • 不能以数字为开头
  • 变量名要做到见名知意
  • 建议定义格式
    • 单驼峰格式:stuName
    • 双驼峰格式:StuName
    • 下划线拼接:stu_name

使用变量

$变量名

撤销变量

unset 变量名

注意:关于单引号的问题

' '无法将变量名替换成变量的值

案例:定义变量Animal=log,输出结果是 there are many dogs

#!/bin/bash

Animal="dog"

echo "there are many ${Animal}s"

1.3 用户交互

格式:

read -p "给用户的提示:" 变量名

提示信息是给用户看的

用户输入的内容会保存到后面这个变量中

案例:

#!/bin/bash

read -p "请输入你的姓名:" stuName
read -p "请输入你的年龄:" stuAge
read -p "请输入你的性别:" stuGender

echo "姓名:$stuName,年龄:$stuAge,性别:$stuGender"

1.4 四则运算

shell中,默认会将变量作为字符串,包括数字

格式:

$[数学表达式]

案例:让用户输入三个数字,输出三个数字的和

#!/bin/bash
read -p "请输入第一个数字:" num1
read -p "请输入第二个数字:" num2
read -p "请输入第三个数字:" num3

sum=$[$num1+$num2+$num3]

echo "三个数字的和:$sum"

1.5 补充内容

命令执行状态值

输出结果重定向

命令执行状态值

执行状态是用来表示命令执行成功还是执行失败

命令的执行状态值,默认是不显示的

  • Linux命令执行成功,用0表示
  • Linux命令执行失败,用非0表示

用Linux的内置变量$?可以查看最近的一个命令的执行状态值

命令的执行输出有两种结果

输出结果:直接显示在终端上,给用户看的

状态结果:是给系统看的

输出重定向

输出重定向就是将原本要输出在终端中的内容,保存到一个文件中

重定向分为三种:

  • 正确输出重定向(1,默认就是1,所以可以省略)
  • 错误输出重定向(2,)
  • 全部输出重定向(&)

两种方法

>        将命令的输出结果保存到一个文件中

          如果文件不存在,就会创建一个新文件,然后将命令输出结果保存进去

          如果文件存在,那么会将原有内容清空,然后将命令输出结果保存进去

>>      将命令的输出结果保存到一个文件中

          如果文件不存在,就会创建一个新文件,然后将命令输出结果保存进去

          如果文件存在,那么在文件原有内容后追加

案例:让用户输入一个用户名,判断这个用户是否存在

#!/bin/bash

read -p "请输入一个用户:" userName

id $userName &>/dev/null
echo "判断用户执行结果:$?"

1.6 if 判断

1.6.1 判断格式

单分支

if 判断表达式;then
    执行的命令     #判断条件成立的情况下,执行这里的语句
    执行的命令     #判断条件成立的情况下,执行这里的语句
    执行的命令     #判断条件成立的情况下,执行这里的语句
fi

双分支

if 判断表达式;then
    执行的命令     #判断条件成立的情况下,执行这里的语句
    执行的命令     #判断条件成立的情况下,执行这里的语句
    执行的命令     #判断条件成立的情况下,执行这里的语句
else
    执行的命令     #判断条件不成立的情况下,执行这里的语句
    执行的命令     #判断条件不成立的情况下,执行这里的语句
    执行的命令     #判断条件不成立的情况下,执行这里的语句
fi

多分支
 

if 判断表达式1;then
    执行的命令     #判断条件1成立的情况下,执行这里的语句
    执行的命令     #判断条件1成立的情况下,执行这里的语句
elif 判断表达式2;then
    执行的命令     #判断条件2成立的情况下,执行这里的语句
    执行的命令     #判断条件2成立的情况下,执行这里的语句
elif 判断表达式3;then
    执行的命令     #判断条件3成立的情况下,执行这里的语句
    执行的命令     #判断条件3成立的情况下,执行这里的语句
else
    执行的命令     #判断条件不成立的情况下,执行这里的语句
    执行的命令     #判断条件不成立的情况下,执行这里的语句
fi
1.6.2 判断对象

判断数字

  • 大小
  • 相等
  • 不相等

判断字符串

  • 相同
  • 不相同

判断文件

  • 判断文件类型

判断命令

  • 命令执行成功
  • 命令执行失败
1.6.3 判断数字

格式

[ 数字 判断符 数字 ]

判断符

-gt        大于

-lt         小于

-ge       大于等于

-le        小于等于

-ne       不等于

-eq       等于

案例:让用户输入两个数字,判断两个数字的和是否大于100

read -p "请输入一个数字:" num1
read -p "请输入另一个数字:" num2

sum=$[$num1+$num2]

if [ $sum -gt 100 ];then
    echo "和大于100"
elif [ $sum -lt 100];then
    echo "和小于100"
else
    echo "等于100"
fi
1.6.4 判断字符串

==        判断相等

!=         判断不相等

判断格式

[ 字符串1 判断符 字符串2 ]

案例:让用户输入一个用户名,判断这个用户名的shell类型是/bin/bash

#!/bin/bash

read -p "请输入用户名:" userName

# 判断用户名是否存在
# 如果用户不存在,退出程序
grep "^$userName\>" /etc/passwd &>/dev/null
num=$?
if [ $num -ne 0 ];then
    echo "没有${userName}这个用户"
    exit 5  # 退出程序,返回一个数字5
fi

# 如果用户存在的情况下,执行这里的操作
# 获取这个用户的shell类型
shellType=`grep "^userName\>" /etcpasswd | awk -F ":" '{print $7}'`
# 判断shell类型
if [ $shellType == "/bin/bash" ];then
    echo "用户的shell类型是/bin/bash"
else
    echo "用户的shell类型不是/bin/bash"
fi
1.6.5 组合条件

&& 逻辑与,要求多个条件要同时满足,则为真

||    逻辑或,要求多个条件满足任意一个,则为真

!   逻辑非,对条件进行取反

案例:让用户输入账号和密码,检查用户的输入,如果账号是root,并且密码是123321,则提示登录成功,否则登录失败

#!/bin/bash

read -p "请输入账号:" userName
read -p "请输入密码: " userPass

if [ "a$userName:" == "aroot" ] && [ "a$userPass" == "a123321" ];then
    echo "ok"
else
    echo "error"
fi

扩展

&&    可以依次执行多个命令
        只有前面的命令执行成功,后面的才执行;如果前面的执行失败,后面的就不执行了
||      可以依次执行多个命令
        只有前面的命令执行失败,后面的命令才执行;如果前面的命令执行成功,后面就不执行了
1.6.6 判断文件

-a 判读文件是存在

-e 判读文件是存在

-f 判读文件是一般文件

-d 判断文件是目录文件

格式

[ 判断符号 文件名 ]

案例:让用户输入一个文件,判断文件类型

#!/bin/bash
read -p "请输入输入一个文件:" fileName
if [ -e $fileName ];then
    if [ -f $fileName ];then
        echo "这个文件是一般文件"
    elif [ -d $fileName ];then
        echo "这个文件是目录文件"
    else
        echo "我也不知道是个啥玩意"
    fi
else
    echo "no such file"
fi
1.6.7 判断命令
判断命令执行成功还是执行失败
判断命令有两种格式
格式1:获取命令的状态值,然后判断这个值是否为0
格式2:直接判断命令
案例:让用户输入一个用户名,判断这个用户是否存在
read -p "请输入输入一个用户:" userName

id $userName &>/dev/null
num=$?
if [ $num -eq 0 ];then
    echo "存在"
else
    echo "不存在"
fi
1.6.8 判断变量是否为空

-z:用于检查字符串的长度是否为零。如果变量为空,那么它的长度为零,条件为真

 案例1:让用户输入一个ip,判断这个ip是否在线

方法一:

#!/bin/bash
   
read -p "请输入一个ip:"ipAddr

num=`echo $ipAddr | wc -c`
if [ $num -le 1 ];then
    echo "你没有输入内容,你想干啥?"
    exit 9
else
    if ping -c1 -W1 $ipAddr &>/dev/null;then
        echo "存在"
    else
        echo "不存在"
    fi
fi

方法二:

#!/bin/bash
   
read -p "请输入一个ip:"ipAddr

if [ -z $ipAddr ];then
    echo "你没有输入内容,你想干啥?"
    exit 3
else
    if ping -c1 -W1 $ipAddr &>/dev/null;then
        echo "存在"
    else
        echo "不存在"
    fi
fi
  • 77
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ys52IT

你的鼓励将是我创作的最大动力你

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值