变量及判断

1、位置变量

	 $$	    		返回程序的PID
	 $0	    		代表脚本本身名
	 $1         代表脚本运行时接的第一个参数(常用) 
	 $2         代表脚本运行时接的第二个参数
	 $3         代表脚本运行时接的第三个参数
	 $*         代表所有参数
	 $@         也是代表所有参数
	 $#         显示后面接的参数的个数
	 $?					上一条命令执行成功则返回0,失败则返回非0 (常用)


2、变量运算
	常用的数值计算命令:
	(())、let、expr、bc、$[]
	
	# a=100
	# b=200
	# c=$(($a+$b))			--算术运算,只能计算整数,二个括号,不能少
	# c=$[$a+$b]			--算术运算,只能计算整数
	# let c=a+b				--算术运算,只能计算整数	
	# expr $a + $b			--算术运算,只能计算整数	,注意格式,等号两侧有空格

	# a=3.14
	# b=1.23
	# echo "$a+$b" | bc		--算术运算,整数小数都能计算,bc是一个计算器
	4.37	
	
	bc是一个计算器
	# bc

	无论是整数还是小数都可以使用bc来计算,用 | 管道传入即可


3、逻辑判断与顺序
	;			--前面执行完,不管成功与否,都执行后面						没有逻辑关系
	&&		--前面执行成功,才执行后面;前面执行失败,后边不执行				逻辑与
	||		--前面执行失败,才执行后面;前面执行成功,后边不执行				逻辑或

	;   &&   || 这些符号都是连接命令

	--正确判断方法:
	# ls /test/ && echo 'existed' || echo 'not existed'
	--错误判断方法:
	# ls /testfsdafas/ || echo 'existed' && echo 'not existed'



二. 条件判断
1. 条件判断语法
	[语法]
	格式1:test<测试表达式>								--不常用
	例:test -f 1.txt && echo 1||echo 0
	
	
	格式2:[<测试表达式>]									--常用
	例:[ -f 1.txt ] && echo 1||echo 0
	
	
	格式3:[[<测试表达式>]]								--不常用
	例:[[ -f 1.txt ]] && echo 1||echo 0
	
2. 各种条件判断
(1)文件存在和文件类型的判断

	-e	是否存在(exist)  
	-f	是否为普通文件
	-d	是否为目录
	-S	socket文件
	-p	pipe 管理文件
	-c	character字符文件
	-b	block块文件
	-L	软连接

	# test -f 1.txt && echo 1||echo 0
	1
	# [ -f 1.txt ] && echo 1||echo 0		--注意表达式与[]前后各有一个空格
	1
	# [[ -f 1.txt ]] && echo 1||echo 0		--注意表达式与[]前后各有一个空格
	1
	# [[ ! -f 1.txt ]] && echo 1||echo 0
	0

	输入一个文件,判断它属于哪种类型
	#!/bin/bash

	read -p "请输入一个文件名:" filename

	[ -e $filename ] || echo "文件不存在"
	[ -f $filename ] && echo "${filename}是普通文件"
	[ -d $filename ] && echo "${filename}是目录"
	[ -S $filename ] && echo "${filename}是socket文件"
	[ -p $filename ] && echo "${filename}是管道文件"
	[ -c $filename ] && echo "${filename}是字符文件"
	[ -b $filename ] && echo "${filename}是块文件"
	[ -L $filename ] && echo "${filename}是软链接文件"

	--------------------------------------------	

	#!/bin/bash

	[ -e $1 ] || echo "文件不存在"

	[ -f $1 ] && echo "${1}是普通文件"
	[ -d $1 ] && echo "${1}是目录"
	[ -S $1 ] && echo "${1}是socket文件"
	[ -p $1 ] && echo "${1}是管道文件"
	[ -c $1 ] && echo "${1}是字符文件"
	[ -b $1 ] && echo "${1}是块文件"
	[ -L $1 ] && echo "${1}是软链接文件"



(2)文件权限相关的判断

	-r	当前用户对其是否可读		--对于普通用户有效,root用户不准确(rw不准)
	-w	当前用户对其是否可写
	-x	当前用户对其是否可执行	--常用
	-u	是否有suid
	-g	是否sgid
	-k	是否有t位
	-s    是否为空白文件		--不为空是真,为空是假

	#!/bin/sh

	[ -e $1 ] || echo "文件不存在" 

	[ -x $1 ] && sh $1 || echo "没有执行权限"

(3)两个文件的比较判断

	file1 -nt  file2	比较file1是否比file2新	(new than)
	file1 -ot  file2 	比较file1是否比file2旧	(old than)
	file1 -ef  file2	比较是否为同一个文件


(4)整数之间的判断
	-eq	相等	 
	-ne	不等	
	-gt	大于	
	-lt	小于
	-ge 	大于等于
	-le	小于等于	

(5)字符串之间的判断
	-z  	是否为空字符串			--判断变量是否为空
	-n		是否为非空字符串
	string1 = string2 是否相等
	string1 != string2 不等

	# a=
	# [ -z $a ] && echo 1 || echo 0
	1
	# a=1
	# [ -z $a ] && echo 1 || echo 0
	0


(6)逻辑判断
	-a      两个条件同时满足,才为true
	-o      两者满足其一,就为true
	!	   非
	

(7) 判断的三种格式的区别
	在(())中使用(算术运算) 		在[]和[[]]中使用(算术运算)			说明
	==					 	 -eq					equal,等于
	!=					 	 -ne					not equal,不等于
	>					 	 -gt					greater than,大于
	>=						 -ge					greater equal,大于等于
	<					 	 -lt					less than,小于
	<=						 -le					less equal,小于等于

	在[]中使用的逻辑操作符	在[[]]中使用的逻辑操作符					说明
	-a					&&							与
	-o					||							或
	!					!							非

	# [ -e install.log -a -f install.log ] && cat install.log || echo "文件不存在"
	# [ -e 1.sh -a -x 1.sh ] && ./1.sh || echo "文件不存在或者文件没有执行权限"
	# [[ -e 1.sh && -x 1.sh ]] && ./1.sh || echo "文件不存在或者文件没有执行权限"


3. 分支结构
(1)单分支结构
	
	
	
	if condition(条件,真或假)
	then						--要么单独一行,要么在if后面,要加一个分号
		statement
	fi
	或
	
	
	
	if condition;then
		statement
	fi

	if(如果/假设) 条件(真/假)			--条件为真时,就执行代码
	then(那么)
 		代码;
	fi

(2)双分支结构
	if  condition(条件,真或假)
		then
			statement		--条件为真,执行的部分
	else
		statement	--条件为假,执行的部分
	fi
	
	

(3)多分支结构
	if  condition(条件,真或假)
	then
		statement
	elif  condition
		then
		statement
	elif  condition
		then
		statement
	else
		statement
	fi
    输入一个文件,判断是否存在,以及文件类型

	#!/bin/bash

	[ -e $1 ] && echo "文件存在" || echo "文件不存在"

	[ -f $1 ] && echo "${1}是普通文件"
	[ -d $1 ] && echo "${1}是目录"
	[ -S $1 ] && echo "${1}是socket文件"
	[ -p $1 ] && echo "${1}是管道文件"
	[ -c $1 ] && echo "${1}是字符文件"
	[ -b $1 ] && echo "${1}是块文件"
	[ -L $1 ] && echo "${1}是软链接文件"
	-----------------------------
	
	输入一个文件判断文件类型 if的单分支:

	#!/bin/bash
	if [ -e $1 ];then
        echo "文件存在"
	fi
	
	# 用逻辑操作符来判断文件不存在
	if [ ! -e $1 ];then
		    echo "文件不存在"
	fi
	
	# 判断文件类型
	if [ -f $1 ];then
		    echo "$1是普通文件"
	fi

	if [ -d $1 ];then
		    echo "$1是目录文件"
	fi

	if [ -S $1 ];then
		    echo "$1是socket文件"
	fi

	if [ -p $1 ];then
		    echo "$1是管道文件"
	fi

	if [ -c $1 ];then
		    echo "$1是字符文件"
	fi

	if [ -b $1 ];then
		    echo "$1是块文件"
	fi

	if [ -L $1 ];then
		    echo "$1是链接文件"
	fi
	----------------------------
	双分支和多分支
	# 判断文件是否存在
	#!/bin/bash
	# 判断文件是否存在
	if [ -e $1 ]
	then
		    echo "文件存在" 
	else
		    echo "文件不存在"
	fi

	# 判断文件类型
	if [ -f $1 ];then
		    echo "${1}是普通文件"
	elif [ -d $1 ];then
		    echo "${1}是目录"       
	elif [ -S $1 ];then
		    echo "${1}是socket文件"
	elif [ -p $1 ];then
		    echo "${1}是管道文件"
	elif [ -c $1 ];then
		    echo "${1}是字符文件"
	elif [ -b $1 ];then
		    echo "${1}是块文件"
	else
		    echo "${1}是软链接文件"
	fi
	-------------------------------------------
	
	如何判断一台主机是否在线? 
	
	#!/bin/bash

	ping $1 -c 2 &> /dev/null

	if (( $? == 0 )) ;then
		    echo "$1在线"
	else
		    echo "$1不在线"
	fi
	-----------
	#!/bin/bash

	ping $1 -c 2 &> /dev/null

	if [ $? -eq 0 ];then
		echo "$1在线"
	else
		echo "$1不在线"
	fi

  

  

原文地址:https://www.cnblogs.com/The-day-of-the-wind/p/12064396.html