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
    				
    

      

  • 相关阅读:
    TCP定时器 之 重传/延迟ACK/保活 定时器初始化
    指针03-指针和字符串
    指针02
    指针01
    switch语句分析
    结构体分析
    参数、返回值、局部变量、数组分析
    多维数组分析
    循环语句分析
    if语句分析
  • 原文地址:https://www.cnblogs.com/eadela/p/11646840.html
Copyright © 2011-2022 走看看