首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >linux--shell

linux--shell

作者头像
eadela
发布2019-10-13 14:21:09
9K0
发布2019-10-13 14:21:09
举报
文章被收录于专栏:eadelaeadela
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
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-10-10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档