linux--shell

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券