Linux——Shell 脚本

简单的 Shell 脚本编译

Shell 脚本的编写要用到 Vim 文本编辑器,按照命令的执行顺序依次编写,每行写一条 Linux 命令。

一个完整的 Shell 脚本应该包括:

  • 脚本声明 (#!):告知系统用何种 shell 来解释。
  • 注释信息 (#):对可执行语句或程序功能做介绍,可以省略。
  • 可执行语句:执行的具体命令。

简单的 Shell 脚本例子:
输入 vim Example.sh,进行Shell 脚本编辑。
输入命令:

#!/bin/bash
#just a test
pwd
ls -al

执行脚本的方法有三种

  • 脚本文件路径,如:/root/Example.sh
  • sh 脚本文件路径:,如:sh /root/Example.sh
  • source 脚本文件路径:source /root/Example.sh

sh 或 source 命令都可以直接执行该脚本,但直接访问脚本路径的方式需要权限:
在这里插入图片描述
需要为脚本设置可执行权限后才能顺利运行,输入命令:chmod u+x Example.sh 即可运行。

执行结果:
在这里插入图片描述


可带参数的 Shell 脚本

Shell 预定义变量:

预定义变量名 变量含义
$0 当前执行 Shell 脚本的程序名
$1-9, ${10}, ${11}… 参数的位置变量
$# 一共有多少个参数
$* 所有位置变量的值
$? 判断上一天命令是否执行成功,0为成功,非0位失败

输入 vim Example.sh 进行 Shell 脚本编辑
在 Vim 编辑器中输入命令:

#!/bin/bash
echo "当前脚本名称为 $0"
echo "总共有 $# 个参数,分别是 $*。"
echo "第一个参数为 $1,第二个参数为 $2。"

运行该脚本:
在这里插入图片描述
注:在脚本文件后面的就是参数。


Shell 脚本的条件测试语句

Shell 脚本有时需要判断用户输入的参数,条件测试语句能够测定特定的表达式是否成立,当条件成立时返回值为 0,否则返回其他数值

测试语句格式:[ 条件表达式 ]
(注:条件表达式两端与中括号之间都应有空格!!!!!!!!!!!)

测试语句可以分为:文件测试、逻辑测试、整数值比较、字符串比较

1. 文件测试

格式为:[ 操作符 文件或目录名 ]

操作符 作用
-d 测试是否为目录
-e 测试文件或目录是否存在
-f 判断是否为文件
-r 测试当前用户是否有权限读取
-w 测试当前用户是否有权限写入
-x 测试当前用户是否有权限执行

例子:
在这里插入图片描述

2. 逻辑测试

格式为:[ 表达式1 ] 操作符 [ 表达式2 ]

操作符 作用
&& 逻辑的“与”
! 逻辑的“否”

例子:判断当前用户是不是 root 用户,如果是,则没有输出,如果不是 root 用户,则输出 user。
在这里插入图片描述

3. 整数值比较

格式为:[ 整数1 操作符 整数2 ]

操作符 作用
-eq 判断是否 等于
-ne 判断是否 不等于
-gt 判断是否 大于
-lt 判断是否 小于
-ge 判断是否 大于等于
-le 判断是否 小于等于

例子:
在这里插入图片描述

4. 字符串比较

格式为:[ 字符串1 操作符 字符串2 ]

操作符 作用
= 比较字符串内容是否相同
!= 比较字符串内容是否不同
-z 判断字符串内容是否为空

例子:在这里插入图片描述

条件测试语句

if条件语句

if 条件语句可分为 单分支结构、双分支结构、多分支结构

① 单分支 if 语句
单分支 if 语句仅有 if、then、fi 关键词组成,只在条件成立后执行。

if 条件测试操作
then 命令序列
fi

例子:判断传递进来作为参数的目录是否存在,若不存在则自动创建。

#!/bin/bash
if [ ! -e $1 ]
then
mkdir -p $1
fi

在这里插入图片描述

② 双分支 if 语句
双分支结构是由 if、then、else、if 关键词组成。

if 条件测试操作
then 命令序列1
else 命令序列2
fi

例子:判断指定主机能否 Ping 通,根据返回结果分别给予回应。

#!/bin/bash
ping -c 3 -i 0.2 -W 3 $1 &> /dev/null
if [ $? -eq 0 ]
then 
echo "Host $1 is up"
else
echo "Host $1 is down"
fi

-c 3表示发送 3 个数据包;
-i 0.2 表示每 0.2 秒发送一个数据包;
-W 3 表示 3 秒即超时
$1 为用户输入的第一个参数 (IP地址)
&> /dev/null 表示重定向,无论是标准输出还是错误输出,都将其结果重定向到 /dev/null 中,&> 等同于 2>&1
$? 表示上一条命令的执行结果,判断是否等于0 (即是否成功 ping 通)。
在这里插入图片描述

③ 多分支 if 语句
多分支结构是由 if、then、else、elif、fi 等关键词组成。

if 条件测试操作1
then 命令序列1

elif 条件测试操作2
then 命令序列2

else 命令序列3

fi

例子:判断用户输入的分数在哪个区间,然后判定为优秀、合格或不合格。

#!/bin/bash
read -p "Enter your score (0-100):" GRADE
if [ $GRADE -ge 85 ]
then echo "$GRADE is Excellent"
elif [ $GRADE -ge 70 ] && [ $GRADE -le 84 ]
then echo "$GRADE is Pass"
else echo "$GRADE is Fail"
fi

注:read 命令用于将用户输入参数赋值给指定变量,格式为:read -p(提示语句) 变量名
在这里插入图片描述


for条件语句

for 语句会读取多个不同的变量值,然后逐一执行同一组命令。

for 变量名 in 取值列表
do
	命令序列
done

例子:从列表文件中读取主机地址,逐个测试是否可 ping 通。

#!/bin/bash
HLIST=$(cat /root/ipadds.txt)
for IP in $HLIST
do
ping -c 3 -i 0.2 -W 3 $IP &> /dev/null
if [ $? -eq 0 ]
then echo "HOST $IP is up"
else echo "HOST $IP is down"
fi
done

从 ipadds.txt 中读取主机地后赋值给 HLIST 变量后逐个 ping 列表中的主机 IP 地址。
在这里插入图片描述


while 条件语句

while 条件语句用于重复测试某个条件,当条件成立时则继续重复执行。

while 条件测试操作
do 
	命令序列
undo

例子:随机生成一个 0-99 的整数,判断并提示用户输入的值过高或过低,只有当用户猜中才结束程序。

#!/bin/bash
PRICE=$(expr $RANDOM % 100)
TIMES=0
echo "商品价格为0-99之间,猜猜看是多少?"
while true
do
read -p "请输入你猜测的价格树木:" INT
let TIMES++

if [ $INT -eq $PRICE ]; then
echo "恭喜你答对了,实际价格是$PRICE"
echo "总共猜测了$TIMES 次"
exit 0

elif [ $INT -gt $PRICE ]; then
echo "太高了"
else echo "太低了"
fi
done

在这里插入图片描述


case 条件

case 条件语句可以依据遍历的不同取值,分别执行不同的命令动作。

case 变量值 in
	模式1)
		命令序列1
	;;
	模式2)
		命令序列2
	;;
	*)
	默认命令序列
esac

例子:提示用户输入一个字符,并将其赋值给遍历 KEY,判断遍历 KEY 为何种字符后分别输出时字母、数字还是其他字符:

#!/bin/bash
read -p "请输入一个字符:" KEY
case "$KEY" in

[a-z]|[A-Z])
echo "您输入的是 字母"
;;
[0-9])
echo "您输入的是 数字"
;;
*)
echo "您输入的是 空格,功能键或其他控制字符"

esac

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43915762/article/details/87870059
今日推荐