Linux shell
1、shell的概念
1)shell是一个命令行解释器,它为用户提供了一个向linux内核发送请求以便运行程序界面的系统级程序。
用户可以通过shell来启动、挂起、停止。甚至编写一些程序。
2)它还是一个功能强大的编程语言,易编辑,易调试,灵活性强。shell是结核性的脚本语言,在我们
shell中可以直接调用linux系统命令。
外层应用程序
|
shell命令解释器 --》转换
|
内核
|
硬件 --》010101010....机器语言
#! shebang
如果脚本文件中没有#!这一行,那么它执行时会默认用当前Shell去解释这个脚本(即:$SHELL环境变量)
2、shell执行的原理
1)在我们计算机语言中,最底层是硬件,硬件是通过内核进行管理的。内核通过管理硬件进行功能的实现,但是在计算机语言里底层硬件只能识别0101...的机器语言,无法识别a,b,c,asc码语言。在这中间就需要一个翻译机制进行编译,就是所谓的shell编辑器, shell编辑器可以讲外层输入的asc码翻译成计算机能识别的机器语言,所以说内核要通过shell编辑器进行翻译才能对硬件进行管理。
2)反之,硬件要将输入的请求响应给外层应用,那么我们内核是无法识硬件的机器语言,那么这时shell编辑器也会将硬件处理的机器语言翻译成ascll语言给内核,内核再进行shell编辑器反馈给外层应用。最后就会得到我们想要的结果了
3、Linux中支持的shell环境
[root@java15 ~]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/bin/dash
/bin/tcsh
/bin/csh
4、shell脚本的执行方式
. shell.sh
sh shell.sh
./shell.sh (必须要有X权限才可以操作) chmod u+x shell.sh
6、变量
1)环境变量
系统环境(全局):cat /etc/profile
用户环境变量(局部):cat .bash_profile ,root修改后,beifeng也是不能使用的
这两类文件别轻易修改
2)位置变量
获取脚本文件时所传入的参数,将传入的参数保存在位置变量中,以便于在脚本中可以使用这些变量。
$1,$2,$3,$4,$5,$6,$7,$8,$9,${10},${11}.....
编写位置变量:
[root@java15 sh]# vi 1.sh
#!/bin/bash
echo $2
echo $3
echo $1
调用脚本并且传入参数
[root@java15 sh]# sh 1.sh start stop restart
stop
restart
start
3)预定义变量
$0 显示脚本名称
$! 进程中的PID号,每一个进程都有一个编号
$$ 当前进程的id号
$# 当前传入shell的参数个数
$* 整体打印参数
$@ 逐个显示参数内容
$?判断表示程序退出的代码 (返回0表示成功,非0表示失败)
6、4)自定义变量
语法格式:name=[value]
注意:
变量对大小敏感
等号两边不能有空格
定义好之后用($变量名)调用变量
用法:a=12
echo $a
5、逻辑符号
&&:逻辑与
cmd1&&cmd2:表示前一个执行成功后,才会执行后面的命令
如:# cat /etc/passwrd && mkdir test(不执行第二个命令)
# cat /etc/passwd && mkdir test(执行第二个命令)
||:逻辑或
cmd1||cmd2:表示前面一个命令执行失败,才会执行后面的命令
如:# cat /etc/passwrd || mkdir hello
;没有逻辑 (无逻辑)
cmd1;cmd2
顺序执行
6、shell计算
# echo $((a+b))
# echo $[a+b]
# echo $(($a+$b))
# echo $[$a+$b]
# expr $a + $b 注意:加号前后要加空格
7、内置判断
数字判断:
-eq 等于则为真
-ne 不等于则为真
-gt 大于则为真
-ge 大于等于则为真
-lt 小于则为真
-le 小于等于则为真
数字:
a=11
b=12
[ $a -eq $b ];echo $?
字符串判断:
=:字符串内容相同则为真,就是说包含的文本一摸一样。
!=:字符串内容不同,则为真(!号表示相反的意思)
-z:字符串内容为空(长度为零)则为真
测试:
[ "as" = "aa" ];echo $?
[ "as" != "aa" ];echo $?
[ -z $a ];echo $?
[beifeng@bigdata-03 shell]$ a="I am"
[beifeng@bigdata-03 shell]$ echo $a
I am
[beifeng@bigdata-03 shell]$ b="B am"
[beifeng@bigdata-03 shell]$ [ $a = $b ];echo $?
-bash: [: too many arguments
2
[beifeng@bigdata-03 shell]$ [ "$a" = "$b" ];echo $?
1
3)文件测试
-e 文件名 : 如果文件名存在即为真
-r 文件名 : 如果文件名存在且可读则为真
-w 文件名 : 如果文件名存在且可写则为真
-x 文件名 : 如果文件名存在且可执行则为真
! : 非
-a : and
-o : or
[ -e /etc/passwd -a 2 -eq 2 ];echo $?
[ -e /etc/passwd ];echo $?
7、for循环
#!/bin/bash
for i in tom tony leo
do
echo $i
done
【需求】使用for循环
#!/bin/sh
for MONTH in {1..12} //或者这里也可以写$(seq 1 12)
do
mkdir -p /opt/test/$MONTH
done
【需求】求1到10的和
#!/bin/bash
for((i=1;i<=10;i++))
do
SUM=$((SUM+i))
done
echo $SUM
【扩展】
使用延迟(有趣的进度条):
#!/bin/bash
b=''
for ((i=0;$i<=100;i++))
do printf "Progress:[%-100s]%d%%\r" $b $i
sleep 0.1
b=#$b
done
echo
2)if判断:
第一种写法:
if 条件判断
then
command.....
fi
eg.
[root@java15 sh]# vi test05.sh
#!/bin/bash
if [ 3 -eq 3 ]
then
echo Yes
fi
[root@java15 sh]# bash test05.sh
Yes
第二种写法:
if 条件语句
then
command ....
else
command ....
fi
eg.
[root@java15 sh]# vi test06.sh
#!/bin/bash
if [ -d /home/jerry/tmp ]
then
ls /home/jerry/tmp
else
mkdir /home/jerry/tmp
echo "目录创建成功"
fi
# sh test06.sh
目录创建成功
第三种写法:
if 条件语句
then
command...
elif 条件语句
then
command...
elif 条件语句
then
command...
....
else
command...
fi
eg.
#!/bi/sh
# read socre and choose level
# read 相当于Java中的scanner 是一种交互式命令,读取设备的输入
echo "请输入学生成绩score:"
read score
if test $score -ge 90;
then
echo level A;
elif [ $score -ge 80 -a $score -lt 90 ]
then
echo "level B";
elif test $score -ge 70 -a $score -lt 80
then
echo "level C";
elif [ $score -ge 60 ] && [ $score -lt 70 ]
then
echo "level D";
else
echo 不及格;
fi
8、while循环
【需求】求1到10的和
#!/bin/bash
i=1
while [ $i -le 10 ]
do
SUM=$((SUM+i))
i=$[i+1]
done
echo $SUM
【需求】读取文件内容
#!/bin/bash
while read -r line
do
echo $line
done < /etc/passwd
控制语句case语句
语法1:
case $变量名称 in
条件1)
命令序列
;;
条件2)
命令序列
;;
条件3)
命令序列
;;
*)
esac
例如:
#!/bin/bash
case $1 in
top)
top
;;
free)
free
;;
ls)
ls /opt/cmz
;;
*)
echo "usages: top|free|df"
esac
语法2:
case $变量名称 in
条件1|条件2)
命令序列
;;
条件3|条件4)
命令序列
;;
条件5|条件6)
命令序列
;;
*)
esac
例如: #!/bin/bash
case $1 in
cat|dog)
echo "animal"
;;
pen|pencil)
echo "study"
;;
*)
echo "usages: cat|dog|pen|pencil"
esac
十一、Linux中的定时任务
1、date
显示当前系统的时间
# date -s "2017-11-18 17:03:30"
# date "+%Y%m%d"
七天前
# date -d '7 day ago' '+%Y%m%d%H%M'
2、at命令:定时计划任务
在特定的时间执行一次后结束
格式:at now+时间(相对于当前时间)
--at 时间(绝对时间:在当前时间之后的一个具体时间)
例如:at now+2minutes
at 10:26
步骤:at now+2minutes按回车键键入
at> mkdir /opt/test
at> 这时可以
--按Ctrl+d结束编辑
--# at -l:查看未执行的定时计划
3、Crontab计划任务
-->周期性执行计划任务
选项使用:
crontab -l (list ) #查看目前的计划任务列表
crontab -r (remove) #删除计划任务
crontab -e (eidt) #编辑周期性计划任务
进程名称是crond
ps -ef | grep crond $查看此进程是否开启
-》检查服务是否开启
# service crond status
# service crond start
# service crond stop
# service crond restart
-》执行身份管理员
-》注意:凡事只要涉及到服务相关的,都会有开机设置项
开启# chkconfig crond on
关闭# chkconfig crond off
-》执行身份管理员
cat /etc/crontab
* * * * * user-name command to be executed
分 时 日 月 周 命令
/ 表示频率
- 表示范围
, 表示指定执行
【假设场景】
每周三的凌晨两点
0 2 * * 3 cp /etc/passwd /tmp
每个月10号和25号凌晨1点5分
5 1 10,25 * * *****
每10分钟执行一次
*/10 * * * * *****
每天凌晨1点到6点
0 1-6 * * * *****
每小时的第5分钟执行一次
5 * * * * *****
每月8号的7:30分执行
30 7 8 * * *****
每年的6月8号5:30分执行
30 5 8 6 * * ******
每天8到11点的第25分钟执行
25 8-11 * * * *****
每小时的第5分钟和15分钟和25分钟执行
5,15,25 * * * * *******
【示例】
每分钟执行一次将结果写到一个文件中
*/1 * * * * date >> /opt/test.txt
制定完成建议重启服务
# service crond restart