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编写一个等腰三角形,接收用户输入的数字
				
				
				
------

  

posted @ 2018-09-14 15:36  H......T!  阅读(292)  评论(0编辑  收藏  举报