zoukankan      html  css  js  c++  java
  • Shell----简单整理

    ------------------------------------------------------------------Shell脚本----------------------------------------------------------------------------------------
    
    	1:shell是一个在操作系统上的软件,linux登录后默认就进入这个软件。
    	   shell是一个命令解释器,能解析用户输入的命令(ls,pwd......)。
    	   shell拥有自己的内建命令集。
    	   
    	2:bash
    		bash(Bourne Again shell)是shell的扩展,并且完全兼容shell(类似vim与vi的关系)
    		
    	3:什么是shell script
    		Shell脚本是利用shell的功能所写的一个小程序,将一些shell的语法与命令写在里面,
    		搭建管道与数据重定向等功能,以达到我们所想要的功能。
    		
    	4:解释型语言与编译型语言
    		Shell脚本是解释型语言,执行的时候是逐条解释你写的程序。(Python)
    		编译型语言需要先进行编译器编译,将代码翻译成机器能识别的指令,然后运行(C++)
    		
    	一:创建
    		1:使用文本编辑器(vim)来创建文本文件(以.sh结尾)
    			#!---------------------------------第一行必须包括shell的声明
    			#/bin/bash--------------------------告诉系统执行的时候调用什么解释器
    			
    		2:输入命令(linux以及shell内建命令)
    			echo "hello word"
    			
    		3:给文件添加执行权限。
    			chmod 755 hello.sh
    			
    		4:运行脚本。
    			第一种方式:指定脚本的绝对或相对路径来运行 ./hello.sh
    			第二中方式:直接运行解释器,将脚本作为参数运行sh hello.sh
    			
    		5:常见问题
    			-bash:./hello.sh:Permission denied 没有赋予执行权限
    			
    	二:shell变量,赋值
    		1变量:
    			变量:以字符或下划线开头,后面跟任意长度的字母:var=linux
    			
    			变量的引用:在变量前面加"$"符号:echo "$var"
    			
    			**如果变量的中间有空格,需要用双引号引起来:var="hello word"
    		
    		2特殊变量:
    			位置参数:$n,n为数字,$0为命令本身,$1-$9是命令第一到九个参数
    			$*---------------------------------代表所有的参数。
    			$#---------------------------------代表参数的个数
    			$?---------------------------------代表命令的返回状态
    			
    		3命令替换和赋值:
    			命令替换格式:------------------------------$(cmd)    或者   `cmd`#   ``为tab上的反引号。
    			在执行命令的时候会先将$(cmd)或者`cmd`里的命令先执行一遍,再将结果返回到原来的命令中。
    			var=$(uname-a)
    			echo $var
    			
    			命令替换和管道的去区别?
    				命令替换:是将一个命令的输出作为另外一个命令的参数。
    				管道    :将命令的输出作为下一个命令的标准输入。
    				如:data + %Y|touch
    					touch $(data + %Y)
    
    		4算数运算和赋值:
    			echo 1+2,没有输出3。(shell需要特殊的格式来进行算数运算)
    			方式一:((i=$j+$k))
    			方式二:let i=$j+$keys
    			
    			赋值:
    				var = $(($i+$j))
    				echo $var
    		
    		5多个命令分隔符:
    			分号(;)是shell的命令分隔符,让同一行的命令能够顺序执行。:echo1 ;echo2
    			
    		练习题:
    			1:命令行输入2个数字,写个小程序,计算2个数字的和,并输出结果
    				#!/bin/bash
    				num1=$1
    				num2=$2
    				sum=$(($num1+$num2))
    				echo $sum
    			
    			2:命令行输入2个文件,写个小程序,把这两个文件都拷贝到以年月日命名的目录下,并输出每次拷贝的执行结果  date +%Y%m%d
    				#!/bin/bash
    				file1=$1
    				file2=$2
    				dir=`date +%Y%m%d`
    				mkdir $dir
    
    				cp $file1   $dir && echo "copy ok"
    
    				cp $file2   $dir  && echo "copy ok
    	
    	三:shell中的控制结构if:
    		#!/bin/sh
    		#make a directory
    		mkdir /home/dave/mydocs
    		#copy all doc files
    		cp *.docs /home/dave/docs
    		#delete all doc files
    		re *.docs
    		
    		上述脚本有什么问题?如果目录创建失败或目录创建成功但文件拷贝失败会如何?
    			会导致文件没有备份就被删除。因此需要在命令执行前做逻辑判断,
    			根据上次命令的不同的执行状态,来采取不同的操作。这里大概就会分为两类:条件判断,基于各种条件,进行后续相应操作;循环控制
    			
    		1:if语句和test命令
    			(1):字符串测试(两边要有空格)
    				== 等于
    				!= 不等于
    				> 大于
    				< 小于
    				-z string 测试指定字符是否为空,空为真,非空为假。
    				-n string 测试指定字符串是否为空,空为假,非空为真。
    			
    			(2):文件测试
    				-e FILE 测试文件是否存在
    				-f file 测试文件是否为普通文件
    				-d file 测试指定路径是否为目录
    				-r file 测试文件对当前用户是否可读
    				-w file 测试文件对当前用户是否可写
    				-x file 测试文件对当前用户是否都可执行
    				
    			(3):组合测试
    				-a:and
    				-o:or
    				!:非
    				
    			练习:
    				1:判断当前用户是否是root,不是的话退出,如果是的话显示一下root的登录shell
    					用户id:id -u
    					退出: exit
    					切分文件行:cut ,-d设置分隔符,-f打印某字段 
    
    					#!/bin/bash
    					if [ `id -u` -eq 0 ]
    					then
    					  shell=`grep "^root" /etc/passwd|cut -d : -f 7`
    					  echo $shell
    					else 
    					  exit 1
    					fi
    
    				2:命令行输入任意三个整数,判断最大的数
    					MAX=$1
    					if [ $2 -ge $1 ]; then
    						MAX=$2
    					fi
    					if [ $3 -ge $MAX ]; then
    							 MAX=$3
    					fi
    
    					echo "the max number is $MAX."
    
    				3:用Shell脚本,判断/bin/nohup是不是可执行文件,如果是将其拷贝到/tmpdir目录下,判断如果/tmpdir目录不存在,自动创建。
    					if [ -x /bin/nohup ]
    					then
    					  if [ ! -d /tmpdir ]
    					  then
    						mkdir /tmpdir
    					  fi
    					  cp /bin/nohup /tmpdir
    					fi
    				
    	四:shell中&&和||的使用方法
    		1:&&运算符:
    			command1 && command2
    			
    			&&:左边的命令返回真(0),执行成功后,右边的命令才能被执行。
    			命令之间使用&&连接,实现逻辑与的功能。
    			如:test -f /var/log/messages && echo ok
    			
    		2:||运算符:
    			command1 || command2
    			
    			||:则与&&相反,如果||左边未成功执行,那么执行||右边的命令才能被执行。
    			如:test -f ||echo error
    		
    	五:for循环语法:
    		1:for循环
    			for arg in[list]
    			do
    				command.....
    			done
    			list列表可以是以空格分割的字符串,也可以是命令替换返回的结果。
    			如:
    				for v in /etc/sudoers/etc/resol|v.conf
    				do ls -l $v
    				done
    		练习:	
    			1:请用for创建100个文件,文件名为ps1-ps100
    				#!/bin/bash
    				for i in `seq 100`
    				do
    				touch ps$i
    				done
    			
    			2:请用for把ps1-ps100,分别创建100个tar包,命名ps1.tar-ps100.tar
    				#!/bin/bash
    				for i in `ls ps*`
    				do
    					tar -cvf $i.tar $i
    				done
    				
    	六:while循环语法:
    		1:while循环:
    			while [condition]
    			do
    				condition
    			done
    			
    			输入名字打印一个随机数字
    			while read -p "please input a name "name;
    			do
    				echo $name $RANDOM;
    			done
    			
    	七:shell函数:
    		格式:
    			function nmae(){
    			
    			}
    		shell函数可以带function关键字,也可以不带。
    		shell函数内可以加return返回值,也可以不带,如果不带就以最后一条命令运行结果,作为返回值。
    		
    		例如:
    			demoFun(){
    				echo *这是我的第一个shell 函数!*
    			}
    			echo "------函数开始执行----------------"
    			demoFun
    			echo "------函数执行完毕-----------------"
    				
    	练习:	
    		1:请查找出/etc/下面所有包含name字符串的文件
    		2:批量创建10个用户,用户名为user1-user10,并设置统一的密码为123456。要求先判断用户是否存在,不存在再创建。
    		3:将/etc/下所有.conf结尾的文件,拷贝到/newconf目录,将/newconf打包为以当前时间戳定义的文件名。
    			要求:判断/newconf目录是否存在,如果不存在就自动创建,如果存在,就先清空这个目录
    		4:请用for创建100个文件,文件名为1.py-100.py,并全部更改文件名为lufei1.py-lufei100.py。
    		5:写一个编译安装python3的脚本
    		6:请用shell编写一个等腰三角形,接收用户输入的数字
    				
    				
    				
    ------
    

      

  • 相关阅读:
    cache buffers chains ,buffer busy waits
    关于I/O的一些脚本
    模拟buffer busy waits等待事件
    找出热点块所属的用户,对象名,类型
    找到引起磁盘排序的SQL
    db file parallel write,write complete waits
    free buffer waits
    检查日志文件是否传输到备用数据库
    模拟direct path read 等待事件
    3系统启动后的 wifi 加载过程
  • 原文地址:https://www.cnblogs.com/w-s-l123/p/9646942.html
Copyright © 2011-2022 走看看