SHELL脚本简单说明

我怕爱的太早我们不能终老 提交于 2020-02-21 22:32:38

1.执行脚本两种方式

  • bash解释器命令直接运行Shell脚本文件(不需添加执行权限)
  • 输入完整路径的方式执行(需要添加可执行权限)

2.接收用户的参数

  • $0 : 对应的是当前Shell脚本程序的名称
  • $# : 共输入个多少的参数
  • $* : 输入的参数有哪些
  • $? : 对应的显示上一次命令的执行返回的值
  • $1,$2,$3,$4 : 分别对应的低N个位置的参数

3.判断用户的参数

  • 条件测试语法可以判断表达式是否成立,若条件成立则返回数字0,否则便返回其他的随机数值。(表达式两边均应有一个空格)
  • 格式: [ 条件表达式 ]
  • 根据测试对象划分4种:
    • 文件测试语句
    • 逻辑测试语句
    • 整数值比较语句
    • 字符串比较语句
3.1 文件测试所用的参数
运算符 作用
-d 测试文件是否为目录类型
-e 测试文件是否存在
-f 判断是否为一般文件1
-r 测试当前用户是否有权限读取
-w 测试当前用户是否有权限写入
-x 测试当前用户是否有权限执行
3.2 逻辑测试所用的参数
运算符 作用
&& “与”,表示当前面的命令执行成功后才会执行它后面的命令
| | “或” ,表示当前面的命令执行失败后才会执行它后面的命令
“非” ,表示把条件测试中的判断结果取相反值。
3.3 可用的整数比较运算符
运算符 作用
-eq 是否等于
-nq 是否不等于
-gt 是否小于
-lt 是否大于
-le 是否等于或小于
-ge 是否大于或等于
3.4 常见的字符串比较运算符
运算符 作用
= 比较字符串内容是否相同
!= 比较字符串内容是否不同
-z 判断字符串内容是否为空

4.流程控制语句

4.1 if 条件测试语句

  • 单分支结构
    由 if 、then、fi 关键词组成,只有在条件成立后才执行预设的命令,“如果…那么…”
#!/bin/bash
DIR="/media/cdrom"
if [ ! -e $DIR]
then 
mkdir -p $DIR
fi
  • 双分支结构
    由if、then、else、fi 关键词组成。它进行一次条件匹配判断,如果与条件匹配,则去执行相应的预设命令。反之则去执行不匹配的时的预设命令,相当于“如果…那么…或者…那么…”
#!/bin/bash

#-c参数来规定尝试的次数,
#使用-i参数定义每个数据包的发送间隔,
#使用-W参数定义等待超时的时间
ping -c 3 -i 0.2 -W 3 $1 &> /dev/null
# $? 若前面的命令执行成功,则返回0
if [ $? -eq 0 ]
then 
echo "Host $1 is on-line"
else
echo "Host $1 is off-line"
fi
  • 多分支结构
    有 if、then、else、elif、fi关键词组成,进行多次条件的判断
#!/bin/bash

#read 用来读取用户输入信息的命令,能够把接收到的用户输入信息赋值给后面的指定变量
#-p 参数用于向用户显示一定的提示信息
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 "Fail"
fi

4.2 for 条件循环语句

格式:

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

案例:

#!/bin/bash
read -p "Enter The User Password : " PASSWD
for UNAME in `cat in 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 ]
then 
echo "$UNAME , create success"
else
echo "$UNAME , create failure"
fi
fi
done

4.3 while 条件循环语句

  • 含义:
    它的循环结构往往在执行前不确定最终执行的次数。
    通过判断条件测试的真假来决定是否继续执行命令

格式:

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

案例:

#!/bin/bash
 
# expr 命令取得结果
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 0
elif [ $INT -gt $PRICE ] ; then
echo "高了!!"
else
echo "低了"
fi
done

4.4 case 条件测试语句

  • 含义:
    case语句是在多个范围内匹配数据,若数据匹配成功则执行命令并结束整个条件测试;而如果数据不在所列出的范围内,则会去执行星号(*)中所定义的默认命令。

格式:

case 变量值 in 
模式1)
   命令序列1
   ;;
模式1)
   命令序列2
   ;;
   ......

案例:

#!/bin/bash

#-p 用于向用户显示一定的提示信息
read -p "请输入一个字符,并按Enter键确认: " KEY

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

5 计划任务服务程序

5.1 一次性计划任务

  • 设置: at 时间
  • 管道符设置:
  • 操作:( 默认为交互式方法 操作)。ctrl + D 组合键结束编写任务
  • 查看已设置好但未执行的一次性任务: at -l
  • 删除:atrm 任务序列号

5.2 周期性计划执行

  • 设置:crontab -e
  • 设置:crontab -l
  • 删除:crontab -r
  • 格式:“分、时、日、月、星期 命令”,如果没有设置需要使用 *
  • 参数说明:
    • 逗号(,)分别表示多个时间段
    • 减号(-)表示一段连续时间周期
    • 除号(/)表示执行任务的间隔时间,“*/2”表示每隔两分钟
  • 注意:
    • 命令需要用绝对路径
    • “分” 字段必须要有数值,绝对不能为空或是*号
    • “日”和“星期”字段不能同时使用,否则就会发生冲突
      - 在用定时任务调用脚本任务时,需注意脚本中的环境变量和一些命令的执行效果,可在脚本中添加 “set -x” 调试看下定位问题
字段 说明
0-59 整数
0-23 整数
1-31 整数
1-12 整数
星期 0-7 整数,0和7均为星期日
命令 要执行的命令或程序的脚本

出自书籍 《Linux就该这么学》


  1. Linux中最多的一种文件类型, 包括 纯文本文件(ASCII);二进制文件(binary);数据格式的文件(data);各种压缩文件。第一个属性为 [-] 。 ↩︎

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!