Shell 脚本
Shell脚本命令的工作放肆有两种:交互式和批处理
➢ 交互式(Interactive): 用户每输入一条命令就立即执行。
➢ 批处理(Batch): 由用户事先编写好一个完整的Shell脚本,Shell会一次性执行脚本中诸多的命令。
查看SHELL
变量可以发现当前系统已经默认使BASH
作为命令行终端解释器了:
[root@minigametest_common server]# echo $SHELL
/bin/bash
接受参数
$0
对应的是当前Shell脚本程序的名称,$#
对应的是总共有几个参数,$*
对应的是所有位置的参数值,$?
对应的是显示上一次命令的执行返回值,而$1,$2,$3...
则分别对应着第N个位置的参数值,如图4-15所示
[root@minigametest_common server]# vim test.sh
#!/bin/bash
echo "当前脚本名称为$0"
echo "总共有$#个参数,分别是$*"
echo "第一个参数为$1,第2个为$2"
[root@minigametest_common server]# ./test.sh 1 ttt
当前脚本名称为./test.sh
总共有2个参数,分别是1 ttt
第一个参数为1,第2个为ttt
条件语句
按照测试对象来划分,条件测试语句可以分为4种:
➢ 文件测试语句;
➢ 逻辑测试语句;
➢ 整数值比较语句;
➢ 字符串比较语句;
表4-3 文件测试所用的参数
运算符 | 作用 |
---|---|
-d | 测试文件是否为目录类型 |
-e | 测试文件是否存在 |
-f | 判断是否为一般文件 |
-r | 测试当前用户是否有权限读取 |
-w | 测试当前用户是否有权限写入 |
-x | 测试当前用户是否有权限执行 |
表4-4 可用的整数比较运算符
运算符 | 作用 |
---|---|
-eq | 是否等于 |
-ne | 是否不等于 |
-gt | 是否大于 |
-lt | 是否小于 |
-le | 是否等于或小于 |
-ge | 是否大于或等于 |
[root@minigametest_common server]# [ 10 -gt 10 ]
[root@minigametest_common server]# echo $?
1
[root@minigametest_common server]# [ 10 -eq 10 ]
[root@minigametest_common server]# echo $?
0
[root@minigametest_common server]# free -m
total used free shared buff/cache available
Mem: 3789 738 1035 0 2015 2800
Swap: 0 0 0
[root@minigametest_common server]# free -m |grep Mem
Mem: 3789 738 1035 0 2015 2800
[root@minigametest_common server]# free -m |grep Mem |awk '{print $4}'
1035
[root@minigametest_common server]# FreeMem = `free -m |grep Mem |awk '{print $4}'`
-bash: FreeMem: command not found
[root@minigametest_common server]# FreeMem=`free -m |grep Mem |awk '{print $4}'`
[root@minigametest_common server]# echo $FreeMem
1035
表4-5 常见的字符串比较运算符
运算符 | 作用 |
---|---|
= | 比较字符串内容是否相同 |
!= | 比较字符串内容是否不同 |
-z | 判断字符串内容是否为空 |
通过判断String变量是否为空值,进而判断是否定义了这个变量:
[root@minigametest_common server]# [ -z $String]
[root@minigametest_common server]# echo $?
0
if 条件测试语句
在Liunx系统中,read
是用来读取用户输入信息的命令,能够把接收到的用户输入信息赋值给后面的指定变量,-p
参数用于向用户显示一定的提示信息。
root@minigametest_common server]# vim chkscore.sh
#!/bin/bash
read -p "Enter your score(0-100):" GRADE
if [$GRADE -ge 85 ] && [$GRADE -le 100]; then
echo "$GRADE is excellent"
elif [ $GRADE -ge 70 ] && [$GRADE -le 84]; then
echo "$GRADE is pass"
else
echo "$GRADE is fail"
fi
root@minigametest_common server]# ./chkscore.sh
Enter your score(0-100):99
./chkscore.sh: line 3: [: missing `]'
./chkscore.sh: line 5: [: missing `]'
99 is fail
[root@minigametest_common server]# vim chkscore.sh
[root@minigametest_common server]# ./chkscore.sh
Enter your score(0-100):99
99 is excellent
[root@minigametest_common server]# ./chkscore.sh
Enter your score(0-100):80
80 is pass
for 条件循环语句
在执行脚本后,会自动使用从列表文件user.txt中获取到所有的用户名称,然后逐一使用“id 用户名”命令查看用户的信息,并使用$?
判断这条命令是否执行成功,也就是判断用户是否已经存在。
/dev/null是一个被称作Liunx黑洞的文件,把输出信息重定向到这个文件等同于删除数据,可以让用户的屏幕窗口保持简洁。
[root@linuxprobe ~]# vim Example.sh
#!/ bin/bash
read -p "Enter The Users Password : " PASSWD
for UNAME in `cat users.txt`
do
id $UNAME &> /dev/null
if [ $? -eq 0 ]
then
echo "Already exists"
else
useradd $UNAME &> /dev/null
echo "$PASSWD" | passwd -- stdin $UNAME &> /dev/null
if [ $? -eq 0 ]
the n
echo "$UNAME , Create success"
else
echo "$UNAME , Create failure"
fi
fi
done
while条件循环语句
该脚本使用$RANDOM
变量来调取出一个随机的数值(范围为0~32767),将这个随机数对1000进行取余操作,并使用expr命令取得其结果,再用这个数值与用户通过read命令输入的数值进行判断。直到用户输入的值等于expr命令取得的数值后,运行exit 0命令,终止脚本的执行。
[root@linuxprobe ~]# vim Guess.sh
#!/bin/bash
PRICE=$(expr $RANDOM % 1000)
TIMES=0
echo "商品实际价格为 商品实际价格为 商品实际价格为 0-999 之间,猜看是多少? 之间,猜看是多少? 之间,猜看是多少? 之间,猜看是多少? "
while true
do
read -p "请输入您猜测的价格数目: 请输入您猜测的价格数目: 请输入您猜测的价格数目: 请输入您猜测的价格数目: " INT
let TIMES++
if [ $INT -eq $PRICE ] ; then
echo "恭喜您答对了,实际价格是 恭喜您答对了,实际价格是 恭喜您答对了,实际价格是 恭喜您答对了,实际价格是 恭喜您答对了,实际价格是 $PRICE"
echo "您总共猜 您总共猜 g $TIMES 次"
exit 0
elif [ $INT -gt $PRICE ] ; then
echo "太高了! "
else
echo "太低了! "
fi
done
case条件测试语句
[root@linuxprobe ~]# vim Checkkeys.sh
#!/bin/bash
read -p "请输入一个字符,并按 请输入一个字符,并按 请输入一个字符,并按 请输入一个字符,并按 Enter 键确认: 键确认: " KEY
case "$KEY" in
[a -z]|[A -Z])
echo "您输入的是 您输入的是 字母。 字母。 "
;;
[0 -9])
echo "您输入的是 您输入的是 数字。 数字。 "
;;
*)
echo "您输入的是 您输入的是 空格、功能键或其他控制字符。 空格、功能键或其他控制字符。 空格、功能键或其他控制字符。 空格、功能键或其他控制字符。 空格、功能键或其他控制字符。 空格、功能键或其他控制字符。 "
esac
[root@linuxprobe ~]# bash Checkkeys.sh
请输入一个字符,并按 请输入一个字符,并按 请输入一个字符,并按 请输入一个字符,并按 Enter 键确认: 键确认: 6
您输入的是 您输入的是 数字。 数字。
[root@linuxprobe ~]# bash Checkkeys.sh
请输入一个字符,并按 请输入一个字符,并按 请输入一个字符,并按 请输入一个字符,并按 Enter 键确认: 键确认: p
您输入的是 您输入的是 字母。 字母。
[root@linuxprobe ~]# bash Checkkeys.sh
请输入一个字符,并按 请输入一个字符,并按 请输入一个字符,并按 请输入一个字符,并按 Enter 键确认: 键确认: ^[[15~
您输入的是 您输入的是 空格、功能键或其他控制字符。 空格、功能键或其他控制字符。 空格、功能键或其他控制字符。 空格、功能键或其他控制字符。 空格、功能键或其他控制字符。 空