zoukankan      html  css  js  c++  java
  • 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%%
    " $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
    				
    

      

  • 相关阅读:
    卡特兰数
    hdu 1023 Train Problem II
    hdu 1022 Train Problem
    hdu 1021 Fibonacci Again 找规律
    java大数模板
    gcd
    object dection资源
    Rich feature hierarchies for accurate object detection and semantic segmentation(RCNN)
    softmax sigmoid
    凸优化
  • 原文地址:https://www.cnblogs.com/eadela/p/11646840.html
Copyright © 2011-2022 走看看