一丶什么是shell
SHELL终端翻译器是人和计算机硬件之间的翻译官
二丶shell脚本命令的两种工作方式
1.交互式(interactive):用户每输入一条指令就立即执行 2.批处理(Batch):用户实现编写好的完整shell脚本,shell会一次执行脚本中的诸多命令
三丶查看shell'变量
echo $SHELL
四丶编写简单的shell脚本
1.查看当前工作了路径并列出当前目录下所有文件及文件信息
vim example.sh #.sh代表脚本文件 #!/bin/bash #声明脚本 #这是一个示例 #注释信息 pwd #查看当前了路径 ls -al #查看当前路径下的所有文件和信息
五丶接收用户的参数
Linux内设了用于接收参数的变量,变量之间可以使用空格间隔。
$0对应的是当前Shell脚本程序的名称, $#对应的是总共有几个参数, $*对应的是所有位置的参数值, $?对应的是显示上一次命令的执行返回值, 而$1、$2、$3……则分别对应着第N个位置的参数值
[root@linuxprobe ~]# vim example.sh #!/bin/bash echo "当前脚本名称为$0" echo "总共有$#个参数,分别是$*。" echo "第1个参数为$1,第5个为$5。" 结果为: [root@linuxprobe ~]# sh example.sh one two three four five six 当前脚本名称为example.sh 总共有6个参数,分别是one two three four five six。 第1个参数为one,第5个为five。
六丶判断用户的参数
Shell脚本中的条件测试语法可以判断表达式是否成立.
条件成立:返回数字0 否则:便返回其他随机数值
语法:
测试语句的种类:
1.文件测试语句;
2.逻辑测试语句;
3.整数值比较语句;
4.字符串比较语句;
查看是否为目录类型 [root@linuxprobe ~]# [ -d /etc/fstab ] [root@linuxprobe ~]# echo $? 1 查看是否是一般文件 [root@linuxprobe ~]# [ -f /etc/fstab ] [root@linuxprobe ~]# echo $? 0 &&与运算 [root@linuxprobe ~]# [ -e /dev/cdrom ] && echo "Exist" Exist ||或运算 [root@linuxprobe ~]# echo $USER root [root@linuxprobe ~]# [ $USER = root ] || echo "user" [root@linuxprobe ~]# su - linuxprobe [linuxprobe@linuxprobe ~]$ [ $USER = root ] || echo "user" user !非运算 [linuxprobe@linuxprobe ~]$ exit logout [root@linuxprobe root]# [ $USER != root ] || echo "administrator" administrator 条件成立运行与运算,否则运行或运算 [root@linuxprobe ~]# [ $USER != root ] && echo "user" || echo "root" root
[root@linuxprobe ~]# [ 10 -gt 10 ] [root@linuxprobe ~]# echo $? 1 [root@linuxprobe ~]# [ 10 -eq 10 ] [root@linuxprobe ~]# echo $? 0
判断字符串是否为空 [root@linuxprobe ~]# [ -z $String ] [root@linuxprobe ~]# echo $? 0 判断语言 [root@linuxprobe ~]# echo $LANG en_US.UTF-8 [root@linuxprobe ~]# [ $LANG != "en.US" ] && echo "Not en.US" Not en.US
七丶流程控制语句
(1)if条件测试语句
if条件语句单分支组成:if、then、fi
[root@linuxprobe ~]# vim mkcdrom.sh #!/bin/bash DIR="/media/cdrom" if [ ! -e $DIR ] then mkdir -p $DIR fi
if条件语句的双分支结构由if、then、else、fi关键词组成
[root@linuxprobe ~]# vim chkhost.sh #!/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 Off-line." fi
if条件语句的多分支结构由if、then、else、elif、fi关键词组成
[root@linuxprobe ~]# 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@linuxprobe ~]# bash chkscore.sh Enter your score(0-100):88 88 is Excellent [root@linuxprobe ~]# bash chkscore.sh Enter your score(0-100):80 80 is Pass
(2)for条件循环语句
[root@linuxprobe ~]# vim users.txt andy barry carl duke eric george
/dev/null是一个被称作Linux黑洞的文件,把输出信息重定向到这个文件等同于删除数据(类似于没有回收功能的垃圾箱),可以让用户的屏幕窗口保持简洁
[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 ] then echo "$UNAME , Create success" else echo "$UNAME , Create failure" fi fi done
/etc/passwd是用来保存用户账户信息的文件
[root@linuxprobe ~]# bash Example.sh Enter The Users Password : linuxprobe andy , Create success barry , Create success carl , Create success duke , Create success eric , Create success george , Create success [root@linuxprobe ~]# tail -6 /etc/passwd andy:x:1001:1001::/home/andy:/bin/bash barry:x:1002:1002::/home/barry:/bin/bash carl:x:1003:1003::/home/carl:/bin/bash duke:x:1004:1004::/home/duke:/bin/bash eric:x:1005:1005::/home/eric:/bin/bash george:x:1006:1006::/home/george:/bin/bash
(3)while条件循环语句
[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 "您总共猜测了 $TIMES 次" exit 0 elif [ $INT -gt $PRICE ] ; then echo "太高了!" else echo "太低了!" fi done
(4)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~ 您输入的是 空格、功能键或其他控制字符。
八丶计划任务服务程序
计划任务分为一次性计划任务与长期性计划任务,大家可以按照如下方式理解。
一次性计划任务:今晚11点30分开启网站服务。
(1)设置一个一次性计划任务
at 时间设置一个一次性计划任务
at -l删除一个一次性计划任务
[root@linuxprobe ~]# at 23:30 at > systemctl restart httpd at > 此处请同时按下Ctrl+d来结束编写计划任务 job 3 at Mon Apr 27 23:30:00 2015 [root@linuxprobe ~]# at -l 3 Mon Apr 27 23:30:00 2016 a root
[root@linuxprobe ~]# echo "systemctl restart httpd" | at 23:30 job 4 at Mon Apr 27 23:30:00 2015 [root@linuxprobe ~]# at -l 3 Mon Apr 27 23:30:00 2016 a root 4 Mon Apr 27 23:30:00 2016 a root
长期性计划任务:每周一的凌晨3点25分把/home/wwwroot目录打包备份为backup.tar.gz
如果我们希望Linux系统能够周期性地、有规律地执行某些具体的任务,那么Linux系统中默认启用的crond服务简直再适合不过了。创建、编辑计划任务的命令为“crontab -e”,查看当前计划任务的命令为“crontab -l”,删除某条计划任务的命令为“crontab -r”。另外,如果您是以管理员的身份登录的系统,还可以在crontab命令中加上-u参数来编辑他人的计划任务