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%% " $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