简单的 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