shell脚本 比较判断 流程控制if 多分支case语句 循环控制语句 简单的linux脚本基础

一. 比较判断

* 标识常用

1.按照文件类型进行判断

选项作用
-b 文件判断该文件是否存在,并且是否为块设备文件(是块设备文件为真)
-c 文件判断该文件是否存在,并且是否为字符设备文件(是字符设备文件为真)
* -d 文件判断该文件是否存在,并且是否为目录文件(是目录文件为真)
* -e 文件判断该文件是否存在,(存在为真)
* -f 文件判断该文件是否存在,并且是否普通文件(是普通文件为真)
-L 文件判断该文件是否存在,并且是否为符号链接文件(是符号链接文件为真)
-p 文件判断该文件是否存在,并且是否为管道文件(是管道文件为真)
-s 文件判断该文件是否存在,并且是否为非空 (非空为真)
-S 文件判断该文件是否存在,并且是否为套接字文件(是套接字文件为真)

2.两种判断格式

	1. test -e 文件名    eg:# test -e a.sh && echo "yes" || echo "no"
*	2. [ -e 文件名]   	eg:# [ -e a.sh ] && echo "yes" || echo "no"

	eg:[root@localhost test]# [ -e a.sh ] 
		[root@localhost test]# echo $?			
		0			
		//0表示上次输出为true,1表示上次输出false

3.按照文件权限进行判断

选项作用
* -r 文件判断该文件是否存在,并且是否该文件拥有读权限(有读权限为真)
* -w 文件判断该文件是否存在,并且是否该文件拥有写权限(有写权限为真)
* -x 文件判断该文件是否存在,并且是否该文件拥有执行权限(有执行权限为真)
-u 文件判断该文件是否存在,并且是否该文件拥有SUID权限(有SUID权限为真)
-g 文件判断该文件是否存在,并且是否该文件拥有SGID权限(有SGID权限为真)
-k 文件判断该文件是否存在,并且是否该文件拥有SBit权限(有SBit权限为真)
[ -w a.sh ] && echo "yes" || echo "no"		
//这个判断只会判断文件是否有写权限,不能判定这个写权限是谁的

4.两个文件之间的比较

选项作用
文件1 -nt 文件2判断文件1的修改时间是否比文件2的新(如果新则为真) # [ a.sh -nt b.txt ] && echo “yes” || echo “no” //new time
文件1 -ot 文件2判断文件1的修改时间是否比文件2的旧(如果新则为旧) # [ a.sh -ot b.txt ] && echo “yes” || echo “no” //old time
文件1 -ef 文件2判断文件1是否和文件2的Inode号一致,可以理解为两个文件是否为同一个文件。

这个判断用于判断硬链接是很好的办法。

[root@localhost test]# ln /usr/test/b.txt /usr/test/indir/c.txt 		//创建硬链接	
[root@localhost test]# [ /usr/test/b.txt -ef /usr/test/indir/c.txt ] && echo "yes" || echo "no"
	yes 				
	
[root@localhost test]# ll -i
total 4
101159830 -rw-r--r--. 1 root root 91 Jun  5 16:12 a.sh
101159637 -rw-r--r--. 2 root root  0 Jun  7 01:08 b.txt
  1447996 drwxr-xr-x. 2 root root 19 Jun  7 01:19 indir
[root@localhost test]# ll -i /usr/test/indir/
total 0
101159637 -rw-r--r--. 2 root root 0 Jun  7 01:08 c.txt
通过b.txt与c.txt前面的编号一致可以看出两个文件的Inode号一致

5.两个整数之间比较

选项作用
整数1 -eq 整数2判断整数1是否和整数2相等(相等为真)
整数1 -ne 整数2判断整数1是否和整数2不相等(不相等为真)
整数1 -gt 整数2判断整数1是否大于整数2(大于为真) # [ 100 -gt 20 ] && echo “yes” || echo “no”]
整数1 -lt 整数2判断整数1是否小于整数2(小于为真)
整数1 -ge 整数2判断整数1是否大于等于整数2(大于等于为真) # [ 100 -ge 20 ] && echo “yes” || echo “no”]
整数1 -le 整数2判断整数1是否小于等于整数2(小于等于为真)

6.字符串的判断 //数字也可以用==判断

选项作用
-z 字符串判断字符串是否为空(为空返回true)
-n 字符串判断字符串是否为非空(非空返回true)
字串1 == 字串2判断字符串1是否和字符串2相等(相等返回true)
字串1 != 字串2判断字符串1是否和字符串2不相等(不相等返回true)
[root@localhost test]# aa=20
[root@localhost test]# bb=20
[root@localhost test]# [ "$aa" == "$bb" ] && echo yes || echo no
yes
[root@localhost test]# [ "$aa" -eq "$bb" ] && echo yes || echo no
yes

7.多重条件判断

选项作用
条件1 -a 条件2逻辑与,条件1和条件2都成立时,结果true
条件1 -o 条件2逻辑或,条件1和条件2都有一个成立时,结果true
!条件逻辑非,条件取反
[root@localhost test]# bb=20
[root@localhost test]# [ -n "$bb" -a "$bb" -eq 30 ] && echo "yes" || echo "no"
no
[root@localhost test]# [ -n "$bb" -a "$bb" -eq 20 ] && echo "yes" || echo "no"
yes

二. 流程控制 if 多分支case

1.单分支if语法:

//语法一:
if [ 条件 ] ; then
	程序
fi 
//语法二:
if [ 条件 ]
	then
	程序
fi 
	
   # whoami 可以查看当前用户,但是在使用su切换用户的时候 不适用- whoami结果不准确
eg1:
	#shell 标准头部 ,没有可能会在调用其他语言的时候出现一些问题或报错
	#加上它 编译器可以知道我们当前的文件执行的是标准shell脚本
	#!/bin/bash
	#从env中获取当前的登录用户信息 ,
	#1.从env中获取当前配置信息
	#2.通过管道从配置信息中获取当前用户信息
	#3.再次通过管道返回的信息截取 由等号分割的两部分 取第二部分
	user=$( env | grep USER | cut -d "=" -f 2)
	#打印当前用户
	echo "user :" $user
	#判断当前用户是否是root
	if [ "$user"=="root" ]
			then
			echo "The user is root!"
	fi

eg2:
	#!/bin/bash
	#获取磁盘分区中 磁盘使用率 (awk '{print $5}' 获取第5列 的数据 )
	memberUse=$( df -h | grep 'VolGroup00-LogVol00' | awk '{print $5}' | cut -d "%" -f 1)
	echo "内存使用情况:" $memberUse
	if [ "$memberUse" -ge 8 ]
			then
			echo "请注意内存使用情况"
	fi

2.双分支if条件语句

if [ 条件 ]
then
		条件成立时,执行
	else
		条件不成立时,执行
fi 

eg1:
	#!/bin/bash
	#等待30秒 获取用户从键盘上输入的内容
	read -t 30 -p "please input a dir :" dir
	#判断用户输入的内容是不是一个文件夹
	if [ -d "$dir" ]
			then
					echo $dir "This is a dir "
			else
					echo $dir "This is not a dir"
	fi

eg2:
	#!/bin/bash
	#获取tomcat服务进程的内容,
	#grep -v grep 表示去掉本次查询使用grep 产生的进程数据  
	tomcat=$(ps -ef | grep 'org.apache.catalina.startup.Bootstrap start' | grep -v grep | awk '{print $18}')
	echo "tomcat : " $tomcat
	if [ -n '$tomcat' ]
			then
					echo "tomcat service is begining !"
			else
					echo "tomcat service is dowm, warning ...."
	fi
	echo "service is process end"

3.多分支if条件语句

	语法:
		if [ 条件1 ]
			then
				条件成立时,执行
		elif [ 条件2 ]
			then
				条件2成立,执行
		…………
		else
			当所有的条件都不成立时,执行
		fi
			
	eg1:
			#!/bin/bash
			read -t 30 -p 'please input first num :' firstnum
			read -t 30 -p 'please input second num :' secondnum
			read -t 30 -p 'please input operator :' ope
			# 当三个字符中有一个是空的时候给予提示,并结束当前进程
			if [ -z "$firstnum" -o  -z "$secondnum" -o -z "$ope" ]
				then
					echo 'please input the full contents !'
					exit -1
			fi

			#判断num是否为数字 sed 's/[0-9]//g' 表示把管道输出的结果中的0-9数字全部替换成null 
			# eg : 显示中5到10行里匹配root,把行内所有的root替换为FTL,并打印到屏幕上
			#	sed '5,10 s/root/FTL/g' yum.log
			num1=$(echo $firstnum | sed 's/[0-9]//g')
			num2=$(echo $secondnum | sed 's/[0-9]//g')
			if [ -n "$num1" -o -n "$num2" ]
				then
					echo "please input number !"
					exit 0
			fi

			#判断运算符,并进行相应的计算
			if [ "$ope" == "+" ]
				then
					sum=$(($firstnum+$secondnum))
			elif [ "$ope" == "-" ]
				then
					sum=$(($firstnum-$secondnum))
			elif [ "$ope" == "*" ]
				then 
					sum=$(($firstnum*$secondnum))
			elif [ "$ope" == "/" ]
				then
					sum=$(($firstnum/$secondnum))
			else
				echo "operator is wrong !"
				exit 5
			fi
			#输出结果
			echo "$firstnum $ope $secondnum $sum"
		eg2:
			#!/bin/bash
			# 判断输入的内容是否是文件或文件夹

			read -t 30 -p "please input contents :" file

			if [ ! -n "$file" ]
					then
							echo "$file is null !"
							exit 1
			elif [ ! -e "$file" ]
					then
							echo "$file is not file "
							exit 2
			elif [ -d "$file" ]
					then
							echo "$file is directory "
							exit 3
			elif [ -e "$file" ]
					then
							echo "$file is file"
							exit 4
			else
					echo "$file is other file"
			fi

4.多分支case语句

	语法:
	case $变量名 in
			"值1")
				变量值等于值1,执行
				;;
			"值2")
				变量值等于值2,执行
				;;
			…………
			*)
				如果变量的值都不是以上的值,执行
				;;
		esac	

		eg:
			#!/bin/bash
			#判断输入的是yes or no

			read -t 30 -p "please input yes or no :" con
			case "$con" in
					"yes")
							echo "您输入的内容是:yes"
							exit 1
							;;
					"no")
							echo "您输入的内容是:no"
							exit 2
							;;
					*)
							echo "您输入的内容不是yes/no,而是:" $con
							;;
			esac

三. 循环控制

1. for循环一

		语法:
		 for 变量 in 值1 值2 值3 ……
			do 
				程序
			done
		eg:
			#!/bin/bash
			# 使用循环解压缩文件
			ls *.tgz > lg.log
			ls *.tar.gz >> lg.log
			#循环解压缩 把解压输出信息放进linux的垃圾回收站
			for i in $( cat lg.log )
				do
					tar -zxf $i &>/dev/null
				done

2. for循环二

		语法:
		for (( 初始值; 循环控制条件 ; 变量变化))
				do 
					程序
				done
											
		eg:	
			#!/bin/bash
			#for循环打印1-100的和
			sum=0
			for (( i=0 ; i <=100 ; i=i+1 ))
					do
							sum=$(( $sum + $i ))
					done
			echo "sum :" $sum

四. echo输出命令

	echo [选项][输出内容]
		选项:
			-e:支持反斜线控制的字符转换
			 
	-e参数能够转义的字符
			\a 		输出警告音
			\b		退格键,也就是向左删除键
			\n		换行符
			\r 		回车键
			\t 		制表符,也就是Tab键
			\v 		垂直制表符
			\0nnn	按照八进制ASCII码表输出字符。其中0为数字零,nnn是三位八进制数
			\xhh	按照十六进制ASCII码表输出字符。其中hh表示两位十六进制数
	
	
		echo -e '\e[1;30m嫁人就要嫁给我\e[0m' 	设置颜色的格式:
													\e[背景色;前景色;高亮m
													\033[背景色;前景色;高亮m   
													恢复默认为 \e[0m
		
		#输出颜色
			30m = 黑色
			31m = 红色
			32m = 绿色
			33m = 黄色
			34m = 蓝色
			35m = 洋色
			36m = 青色
			37m = 白色
			

参考链接
第一个脚本:
# #键代表注释,但是 下面一句不是注释, 它表示当前脚本是一个标准脚本
# 不加在调用其他语言的时候回报错

#!/bin/bash
# The first program
echo -e “\e[1;31m this is my first shell demo \e[0m”

	脚本调用:
		a)赋予执行权限,直接运行
			chmod 755 a.sh 
			./a.sh         	相对路径调用
			/root/usr/a.sh	绝对路径调用
		b)通过bash调用执行脚本
			bash a.sh
			sh a.sh

五. 删除命令

	#删除临时文件
	rm -rf lg.log
	# 删除之死亡命令 循环删除 根目录下的所有文件,因为linux 是一个文件系统 ,
	# 因此 此命令相当于格式化linux系统
	rm -rf /*

六. 遇到的一些问题记录

1. linux在命令执行过程中ctrl +z 后[1]+ Stopped

	进程挂起,数字是job id
	jobs命令看所有任务
	fg 1 把挂起任务1回到前台
	bg 1 把挂起任务1放到后台

2. 输入错误,无法退格删除

	使用ctrl + 退格 可以删除
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值