Shell终端解释器
人与计算机硬件之间的“翻译官”,用户与Linux系统内部的通信媒介,Shell脚本命令的工作方式有两种:交互式和批处理。
交互式(Interactive):用户每输入一条命令就立即执行
批处理(Batch):用户编写好一个完整的Shell脚本,Shell会一次性执行脚本中的命令
echo $SHELL #使用Bash作为命令行终端解释器
- 结构
1、第一行的脚本声明(#!)用来告诉系统使用哪种Shell解释器来执行该脚本
2、第二行的注释信息(#)是对脚本功能和某些命令的介绍信息
3、之后的可执行语句也就是平时执行的Linux命令
- 执行方式
1、bash example.sh #利用解释器去执行脚本
2、./example #通过输入完整路径的方式来执行
3、之后的可执行语句也就是平时执行的Linux命令
变量
- 预定义变量
* 位置变量:传递脚本参数使用
* 环境变量:保证操作系统运行的变量
* 自定义变量:由用户自定义,可用于用户编写的脚本
- shell基础语法之变量
变量只能由大小写字母,数字和下划线组成。
变量名称不能以数字开头。
变量可以存储数字类型或者字符串类型。
变量赋值等号两边不能有空格。
字符串的变量可以用单引号或者双引号括起来。
单引号:所见即所得,吃什么拉什么 不解析变量
不知道加什么就加双引号 双引号 解析变量
调用方式:
1、echo $applepen
2、echo ${apple} #推荐使用~~~~
- shell 运算符
运算符种类
* 算数运算符
* 关系运算符
* 布尔运算符
* 逻辑运算符
* 字符串运算符
* 文件测试运算符
规则:
* 运算符号两边要有空格
* 遇到特殊符号如*号需要在前面加反斜杠
* 空格和特殊字符串需要用引号括起来
#!/bin/bash
i=1
j=2
addition=`expr $i + $j`
subtraction=`expr $i - $j`
multiplication=`expr $j \* $j`
division=`expr $j / $i`
mod=`expr $j % $i`
echo "addition=${addition} , subtraction=${subtraction} , multiplication=${multiplication} , division=${division} , mod=${mod}"
if [ $i == $j ]
then
echo "i 等于 j"
fi
if [ $i != $j ]
then
echo "i 不等于 j"
fi
#!/bin/bash
num1=5
num2=8
if [ $num1 -eq $num2 ]
then
echo "$num1 是否等于 $num2 : num1 等于 num2"
else
echo "$num1 是否等于 $num2: num1 不等于 num2"
fi
if [ $num1 -ne $num2 ]
then
echo "$num1 是否不等于 $num2: num1 不等于 num2"
else
echo "$num1 是否不等于 $num2 : num1 等于 num2"
fi
if [ $num1 -gt $num2 ]
then
echo "$num1 是否大于 $num2: num1 大于 num2"
else
echo "$num1 是否大于 $num2: num1 不大于 num2"
fi
if [ $num1 -lt $num2 ]
then
echo "$num1 是否小于 $num2: num1 小于 num2"
else
echo "$num1 是否小于 $num2: num1 不小于 num2"
fi
if [ $num1 -ge $num2 ]
then
echo "$num1 是否大于等于 $num2: num1 大于或等于 num2"
else
echo "$num1 是否大于等于 $num2: num1 小于 num2"
fi
if [ $num1 -le $num2 ]
then
echo "$num1 是否小于等于 $num2: num1 小于或等于 num2"
else
echo "$num1 是否小于等于 $num2: num1 大于 num2"
fi
#!/bin/bash
num1=3
num2=23
if [ $num1 != $num2 ]
then
echo "$num1 != $num2 : num1 不等于 num2"
else
echo "$num1 != $num2: num1 等于 num2"
fi
if [ $num1 -lt 25 -a $num2 -gt 15 ]
then
echo "$num1 小于 25 且 $num2 大于 15 : 返回 true"
else
echo "$num1 小于 25 且 $num2 大于 15 : 返回 false"
fi
if [ $num1 -lt 25 -o $num2 -gt 25 ]
then
echo "$num1 小于 25 或 $num2 大于 25 : 返回 true"
else
echo "$num1 小于 25 或 $num2 大于 25 : 返回 false"
fi
#!/bin/bash
apple="apple"
pen="pen"
if [ $apple = $pen ]
then
echo "$apple = $pen : apple 等于 pen"
else
echo "$apple = $pen: apple 不等于 pen"
fi
if [ $apple != $pen ]
then
echo "$apple != $pen : apple 不等于 pen"
else
echo "$apple != $pen: apple 等于 pen"
fi
if [ -z $apple ]
then
echo "-z $apple : 字符串长度为 0"
else
echo "-z $apple : 字符串长度不为 0"
fi
if [ -n "$apple" ]
then
echo "-n $apple : 字符串长度不为 0"
else
echo "-n $apple : 字符串长度为 0"
fi
if [ $apple ]
then
echo "$apple : 字符串不为空"
else
echo "$apple : 字符串为空"
fi
#!/bin/bash
num1=5
num2=8
if [[ $num1 -lt 10 && $num2 -gt 5 ]]
then
echo "返回 true"
else
echo "返回 false"
fi
if [[ $num1 -lt 10 || $num2 -gt 5 ]]
then
echo "返回 true"
else
echo "返回 false"
fi
~ cat testfile.sh
#!/bin/bash
file="/root/testfile.sh"
if [ -r $file ]
then
echo "该文件可读"
else
echo "该文件不可读"
fi
if [ -x $file ]
then
echo "该文件可执行"
else
echo "该文件不可执行"
fi
if [ -w $file ]
then
echo "该文件可写"
else
echo "该文件不可写"
fi
if [ -f $file ]
then
echo "该文件是普通文件"
else
echo "该文件是非普通文件"
fi
if [ -s $file ]
then
echo "该文件为空"
else
echo "该文件不为空"
fi
if [ -d $file ]
then
echo "该文件是目录"
else
echo "该文件不是目录"
fi
#!/bin/bash
a=10
if [ a > 5 ]
then
echo "a 大于 5"
fi
#!/bin/bash
ping -c 3 -i 0.2 -W 3 $1 &> /dev/null
if [ $? -eq 0 ]; then
echo "Host $1 is on-line"
else
echo "Host $1 is not on-line"
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 -ge 84 ]
then
echo "$GRADE is pass"
else
echo "$GRADE is Fail"
fi
在脚本中使用read命令读取用户输入的密码值,然后赋值给PASSWD变量,并通过-p参数向用户显示一段提示信息,告诉用户正在输入的内容即将作为账户密码。在执行该脚本后,会自动使用从列表文件users.txt中获取到所有的用户名称,然后逐一使用“id 用户名”命令查看用户的信息,并使用$?判断这条命令是否执行成功,也就是判断该用户是否已经存在
/dev/null是一个被称作Linux黑洞的文件,把输出信息重定向到这个文件等同于删除数据(类似于没有回收功能的垃圾箱),可以让用户的屏幕窗口保持简洁
#!/bin/bash
read -p "please write user password:" PASSWD
for UNAME in `cat users.txt`
do
id $UNAME &> /de/null
if [ $? -eq 0 ]
then
echo "already exist"
else
useradd $UNAME &> /dev/null
echo "$PASSWD" | passwd --stdin $UNAME &> /dev/null
if [ $? -eq 0 ]
then
echo "$UNAME,create success"
else
echo "$UNAME,create failure"
fi
fi
done
#!/bin/bash
HLIST=$(cat ~/iptables.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 on-line"
else
echo "host $ip is not on-line"
fi
done
#!/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 "你一共猜了$TIMES次"
exit
elif [$INT -gt $PRICE]
then
echo "猜的太高了"
else
echo "太低了又"
fi
done
#!/bin/bash
read -p "请输入一个字符,并Enter确认:" KEY
case "$KEY" in
[a-z][A-Z])
echo "您输入的是字母"
;;
[0-9])
echo "您输入的是数字"
;;
*)
echo "您输入的其它字符"
esac
案例
文件测试即使用指定条件来判断文件是否存在或权限是否满足等情况的运算符
操作符 作用
-d 测试文件是否为目录类型
-e 测试文件是否存在
-f 判断是否为一般文件
-r 测试当前用户是否有权限读取
-w 测试当前用户是否有权限写入
-x 测试当前用户是否有权限执行
[ -d /etc/fstab ]
echo $? #$?变量显示上一条命令执行后的返回值
[ -e /dev/cdrom ] && echo "exist" #&&上一个命令执行成功,在执行下一个命令
[ $USER = root ] || echo "user" #上一个命令执行失败,在执行下一个命令
[ $USER != root ] && echo "root" || echo "user" #先判断当前登录用户的USER变量名称是否等于root,然后用逻辑运算符“非”进行取反操作,效果就变成了判断当前登录的用户是否为非管理员用户了。最后若条件成立则会根据逻辑“与”运算符输出root字样;或条件不满足则会通过逻辑“或”运算符输出user字样
整数比较运算符仅是对数字的操作,不能将数字与字符串、文件等内容一起操作,而且不能想当然地使用日常生活中的等号、大于号、小于号等来判断。因为等号与赋值命令符冲突,大于号和小于号分别与输出重定向命令符和输入重定向命令符冲突
操作符 作用
-eq 是否等于
-ne 是否不等于
-gt 是否大于
-lt 是否小于
-le 是否等于或小于
-ge 是否大于或等于
freeMem=`free -m | grep Mem: | awk '{print $5}'` #定义变量的信息
[ $freeMem -lt 1024 ] && echo "insufficient memory"
字符串比较语句用于判断测试字符串是否为空值,或两个字符串是否相同。它经常用来判断某个变量是否未被定义(即内容为空值)
操作符 作用
= 比较字符串内容是否相同
!= 比较字符串内容是否不同
-z 判断字符串内容是否为空
[ -z $string ]
echo $?