一、什么是Shell
在linux系统中shell介于Linux内核与终端用户之间,让用户通过可以shell来操作内核,提供了用户与内核进行交互操作的一种接口,它接收用户输入的命令并把它送入内核去执行。
一个系统可以存在多个shell,不同的shell可能支持的命令语法是不相同的。
可以通过cat /etc/shells命令查看系统中安装的shell,通过echo $SHELL查看环境变量$SHELL的值,如果在直接在命令行中输入echo $0,则打印的是当前运行的shell名。
二、Shell种类
操作系统内核与shell是独立的套件,而且都可被替换。不同的操作系统使用不同的shell;同一个内核之上可以使用不同的shell。
常见的shell分为两大主流:
①sh:Bourne shell(sh) ,Solaris,hpux默认shell
Bourne again shell(bash) ,Linux系统默认shell
②csh:C shell(csh)
tc shell(tcsh)
三、Shell脚本编程
1.一个简单的Shell脚本
写一个文本以.sh为后缀(扩展名并不影响脚本执行,但见名知意就好)
在文本内编程:
#!/bin/bash
echo "Hello World !"
注:#! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell。
echo 命令用于向窗口输出文本。
执行脚本:
chmod u+x test.sh #使脚本具有执行权限
./test.sh #执行脚本
或者
bash test.sh #强制执行,不推荐
2.Shell变量
变量无需指定类型
在使用变量时,要在变量名前加上前缀“$”
赋值时等号两侧不能有空格..
拼接时为了区分变量,可以用${变量名}
简单计算:$((算式)),而且小数需要特殊处理(awk或者bc)。
数组:
arr=(ele1 ele2 ele3...)
echo ${arr[2]} 取指定元素
echo ${arr[*]} 取所有元素
echo ${#arr[*]} 取数组长度
判断条件(if else):-gt :大于
-lt :小于
-eq :等于
-ne :不等于
-ge :大于等于
-le :小于等于
语法:
#! /bin/bash
read -p "input age:" age
echo $age
if [ $age -ge 18 ]
then echo 成年
else echo 未成年
fi
if(($age<18))
then echo yes
else echo no
fi
if [ $age -gt 10 ] && [ $age -lt 14 ]
then echo 少年
elif [ $age -ge 14 ] && [ $age -lt 18 ]
then echo 青年
elif [ $age -ge 18 ]
then echo 成年
else echo 儿童
fi
结果:
while循环:
#! /bin/bash
num=0
while [ $num -lt 10 ]
do
echo $num
num=$((num+1))
done
while (($num<20))
do
echo $num
num=$((num+2))
done
for循环:
#! /bin/bash
for f in `ls`
do
if test -d $f #!判断文件存在并且是目录
then echo ${f}:文件夹
else echo ${f}:文件
fi
done
for ((i=0;i<10;i=i+1))
do
echo $i
echo "abc" >> a.txt #! 向文件中追加内容
echo "123" > b.txt #!向文件中写入内容,覆盖原有内容
done
分支语法:
case 一个变量 in
值1) 语句;;
值2) 语句;;
esac
#! /bin/bash
read -p "input op:" op
case $op in
"D") echo delete;;
"I") echo input;;
"U") echo update;;
esac
这个语法真的是难记,反人类设计,空格的要求还很严格,(°:з」∠),在这做个浅显的了解就好。
参考链接:://www.cnblogs.com/zhangchao162/p/9614145.html
四、定时任务
顾名思义,指定某个时间或周期去执行某个任务。
通过crontab命令完成,格式如下:(五颗星)
以上各字段还可以使用以后特殊符号:
星号(*):代表每的意思,例如month字段如果是星号,则表示每月都执行该命令操作
逗号(,):用逗号隔开的值指定一个列表范围,例如“1,3,5,7,9”。
中杠(-):表示一个整数时间范围,例如“2-6”表示“2,3,4,5,6”。
正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次,等于“*/2”。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。
crontab -l #!列出当前用户定时任务
crontab -r #!删除当前用户定时任务
crontab -e #!添加定时任务
例子:
* * * * * /home/test.sh #每1分钟执行一次test.sh脚本
10,15 * * * * /home/test.sh #每小时的第10分钟和第15分钟执行一次test.sh脚本
15 8 * * * /home/test.sh #每天早上8点15分执行一次test.sh脚本
15 8 1 jan * /home/test.sh #1月1号的早上8点15分执行一次test.sh脚本
0 6 * * 6 /home/test.sh #每个星期六的早上6点执行一次test.sh脚本
30 3,12 * * * /home/test.sh #每月每天凌晨3点30分和中午12点30分执行test.sh脚本
30 */6 * * * /home/test.sh #每月每天每隔6小时的每30分钟执行test.sh脚本
30 8-18/2 * * * /home/test.sh #每月每天早上8点到下午18点每隔2小时的每30分钟执行test.sh脚本
30 21 * * * /home/test.sh #每月每天晚上21点30分执行test.sh脚本
45 4 1,10,22 * * /home/test.sh #每月1号、10号、22号凌晨4点45分执行test.sh脚本
10 1 * 8 6,0 /home/test.sh #8月份周一、周日凌晨1点10分执行test.sh脚本
00 */1 * * * /home/test.sh #每月每天每小时整点执行test.sh脚本