shell学习之条件测试(参考shell脚本编程诀窍)

1关于test测试,查看man文档知

表达式的判断

( EXPRESSION )                    #EXPRESSION is true

! EXPRESSION                      #EXPRESSION is false

EXPRESSION1 -a EXPRESSION2        #both are true,-o means or

字符串是否为空,相等

-n STRING  #the length of STRING is nonzero,-n can be removed

-z STRING  #the length of STRING is zero(nonexists,or null)

#when comes to string, we use =

STRING1 = STRING2       #the strings are equal

STRING1 != STRING2      #the strings are not equal

数字的比较

#when comes to number,we use different eq ne and so on

INTEGER1 -eq INTEGER2   #INTEGER1 is equal to INTEGER2

-ge  greater or equal

-gt  greater than

-le   -lt   -ne   I

比较文件是否为链接文件

FILE1 -ef FILE2         #FILE1 and FILE2 have the same device and inode numbers

eg

                [[email protected] shell]# test  txt  -ef txthardlink             
                [[email protected] shell]# echo $?
                0
                [[email protected] shell]# test  txt  -ef txtlink(soft)
                [[email protected] shell]# echo $?
                0

所以这个是测试是否是文件链接(包括软硬),大家可以自己试试

比较文件的修改时间

FILE1 -nt FILE2 #FILE1 is newer/older (modification date) than FILE2,timestamp

FILE1 -ot FILE2    文件有修改时间modify time (强调内容改变) 改变时间change time(本质即相关属性改变)  接触时间access time(被访问)

文件类型

-b FILE     #type:block special

-c FILE     #type:character special

-d FILE     # a directory

-e FILE     #FILE exists是否存在

-s FILE     #FILE exists and has a size greater than zero是否为空

-f FILE     #a regular file

-u FILE     #set user-ID   SUID

-g FILE     #FILE exists and is set-group-ID使用时暂时拥有文件所属组的权限SGID

-G FILE     #FILE exists and is owned by the effective group ID真的Group

-h FILE     #a symbolic link (same as -L)

-k FILE     #FILE exists and has its sticky bit set   sticky位其他用户只能添加不能删除

-L FILE     #FILE exists and is a symbolic link (same as -h)

-O FILE     #FILE exists and is owned by the effective user ID

-p FILE     #a named pipe

-S FILE     #FILE exists and is a socket

-r FILE     #FILE exists and read permission is granted

you can  use -w  ,write  ,-x  execute

-t FD       #file descriptor FD is opened on a terminal

很多,但有规律,常用的并不多

2 上面的测试还可用于类似[ -e $num ]结构中

3 if/then条件测试结构(还有case,while,等结构可能后面会涉及,不懂请自行baidu)

①if  [ condition ]

then

COMMAND

fi

or

if  [ condition ];then

COMMAND

fi

②if  [ condition ];then

COMMAND1

else

COMMAND2

fi

③if  [ condition ];then

COMMAND1

elif  [ condition ];then

COMMAND2

else

COMMAND3

fi

big eg.

#if1.sh
#!/bin/bash
#
read -p "guss who am i?"  HELLO
test -z $HELLO&&echo "wrong argv please reinput!"&&exit 1
if [ "$HELLO" = "Jack" ];then
echo "oh,you are jack!"
elif [ "$HELLO" = "Kitty" ];then
echo "oh,you are Kitty!"
elif [ "$HELLO" = "Mike" ];then
echo "oh,you are Mike!"
else
echo "sorry i don‘t remember."
echo "ok,my name is $HELLO"
fi

通常if then可以改为[[ conditon ]]&&条件ok||条件不ok

3 [[ ]]与[]的区别

通常表现在以下几个方面

[ ]使用-a,-o连接多个逻辑表达式,而[[ ]]使用&&,||连接多个表达式

[ ]:通配符不起作用,[[ ]]会展开通配符

[ ]不能使用比较运算符,如>,<,而[[ ]]可以

4 (())

测试数字表达式

结果为0返回1,结果为其他返回0

[[email protected] ~]# ((1-1))

[[email protected] ~]# echo $?

1

[[email protected] ~]# ((1+1))

[[email protected] ~]# echo $?

0

5 条件判断与测试的小程序

#-N可以表示文件是否被修改
#所以有下面的一段监控文件是否被修改的shell script
#watchfile.sh
#!/bin/bash

TT=5 #5 seconds
NFILE=$1 #the watched file

#origin length of the file
len=`wc -l $NFILE |awk ‘{print $1 }‘`

echo " $NFILE has  $len lines "

while :
do
  if [ -N $NFILE ]
  then
  echo "`date`:new entry in $NFILE"
  newlen=`wc -l $NFILE |awk ‘{print $1 }‘`
  newlines=`expr $newlen - $len`
  tail -$newlines $NFILE
  len=$newlen
  fi
  sleep $TT
done

6 正则表达式的测试程序

#RE.sh
#!/bin/bash

for deb in /root/shell/*
do
pkgname=`basename $deb`
if [[ $pkgname =~ .*\.deb ]];then
		#提醒 if紧跟着的[有空格,$前面有一个空格,deb后面有个空格
  echo "FILE $pkgname is a debian package"
else
  echo "File $pkgname is not a debian package"
fi
done

另一个添加捕获的

#如何捕获括号中的字符串
#保存在BASH_REMATCH[]数组中
#RE1.sh
#!/bin/bash
# manage to know your name
read -p "please input your fullname:" NAME
if [[ $NAME =~  (.*)[[:space:]](.*) ]];then
echo "你姓 ${BASH_REMATCH[2]}"
echo "你叫 ${BASH_REMATCH[1]}"
echo "全称 ${BASH_REMATCH[0]}"
fi
执行结果
[[email protected] shell]# ./RE1.sh 
please input your fullname:liancao liu
你姓 liu
你叫 liancao
全称 liancao liu

7 一个猜数字的脚本

#一个猜数字的sh
#numguess.sh
#!/bin/bash
#you may want to guess between 0-50
WORDS=51
GUESS=-1
TIME=0
BELOW=0
TOP=`expr $WORDS - 1 `
let ANSWER=($RANDOM % $WORDS)
let ANSWER+=-1

while [ "$GUESS" -ne "$ANSWER" ] 
do
	echo "the number is between $BELOW and $TOP"
        read -p "your guess:" GUESS
	let TIME+=1
	if [ "$GUESS" -lt "$ANSWER" ] ;then
        	echo "please input larger"
		BELOW=`expr $GUESS + 1`
	elif [ "$GUESS" -gt "$ANSWER" ];then
		echo "please input smaller"
		TOP=`expr $GUESS - 1 `
	else
        	echo "right! you guessed $TIME times"
        fi
done
时间: 2024-12-21 03:48:43

shell学习之条件测试(参考shell脚本编程诀窍)的相关文章

Shell学习之条件测试(四)

Shell学习之条件测试 目录 逻辑测试 文件测试 数值比较 字符串比较 逻辑测试 格式: [ 表达式 ] 操作符 [ 表达式2 ] -- 命令1 操作符 命令2 -- 常用的操作符 ( 注意:-a和-o放在[]里面用,&&和||放在[]外面用 ) -a 或 && 逻辑与 -o 或 || 逻辑或 ! 逻辑否 文件测试 文件测试 格式1: [ 操作符 文件或目录 ] 格式2:test 操作符 文件或目录 常用的测试操作符 -d :测试是否为目录( Directory ) -e

Shell中的条件测试语句

Shell有条件测试语句,一般用test命令或是[]命令来完成,它们是条件判断语句if~then语句的基础,特别是[]命令.下面我们讲解一些条件测试语句. 1. test命令实现条件测试 对于检测系统中某些文件是否存在,或者相关属性时,test命令很好用. 其基本语法如下: test命令还可以测试字符串: test命令还可以测试整数之间的关系: 2. []命令来实现条件测试 使用中括号[]命令来实现条件测试功能时,要特别注意.因为中括号在很多地方都有用到,比如通配符和正则表达式.而在用[]表示条

Shell中的条件测试和循环语句

条件测试 1. 条件测试:test [ 命令test或[可以测试一个条件是否成立,如果测试结果为真,则该命令的Exit Status为0,如果测试结果为假, 则命令的Exit Status为1(注意与C语?言的逻辑表?示正好相反).例如测试两个数的大小关系: 虽然看起来很奇怪,但左方括号[确实是一个命令的名字,传给命令的各参数之间应该?空格隔开,比如,$VAR.-gt.3.]是[命令的四个参数,它们之间必须?空格隔开.命令test或[的参数形式是相同的,只不过test命令不需要]参数.以[命令为

shell基础 变量 条件测试 判断结构

Top NSD ENGINEER DAY02 案例1:Shell脚本的编写及测试 案例2:重定向输出的应用 案例3:使用特殊变量 案例4:编写一个判断脚本 案例5:编写一个批量添加用户脚本 1 案例1:Shell脚本的编写及测试 1.1 问题 本例要求两个简单的Shell脚本程序,任务目标如下: 编写一个面世问候 /root/helloworld.sh 脚本,执行后显示出一段话“Hello World!!” 编写一个能输出系统信息的 /root/sysinfo 脚本,执行后依次输出当前红帽系统的

shell里的条件测试和判断

条件测试: 判断某需求是否满足,需要由测试机制来实现: 如何编写测试表达式以实现所需的测试: (1) 执行命令,并利用命令状态返回值来判断: $?:命令状态返回值 0:成功 1-255:失败 (2) 测试表达式 test  EXPRESSION [ EXPRESSION ] [[ EXPRESSION ]] 注意:EXPRESSION两端必须有空白字符,否则为语法错误: 示例: [[email protected] tmp]# touch a [[email protected] tmp]# [

shell学习笔记1 【linux shell 编程从初学到精通第2版】

已登录用户的个数: who | wc -l 查看系统有哪些用户登录 : who 新建一个文件/bin/ct11,在文件中输入一条命令,chmod为该文件设置执行权限 # cat > /bin/ct11 Who | wc -l 按ctrl+d #  cd /bin # chmod +x ct11 # ./ct11 执行结果: 2 # echo 转义序列: \c :指示echo 不要打印 最后的换行符号 \a :警示字符,通常是ASCII的BEL字符 \b :退格 \f : 换页 \n :换行 \r

《鸟哥的Linux私房菜》学习笔记(8)——bash脚本编程之变量

一.变量命名                                                             1.只能包含字母.数字和下划线,并且不能以数字开头,    2.不应该跟系统中已有的环境变量重名    3.命名要有含义 二.变量赋值                                                            变量名称=值var_name=value 等号两边不能有空格 [[email protected] ~]# NA

Shell学习笔记 - 条件判断式

1. 判断格式 1) test 参数 文件 例: test -e /root/install.log 2) [ 参数 文件 ]  -- 推荐使用 例: [ -e /root/install.log ] 注意:中括号后面和前面需要有空格 2. 判断文件类型参数 1)-d 文件:判断该文件是否存在,并且是否为目录文件 2)-e 文件:判断文件是否存在 3)-f 文件:判断文件是否存在,并且是否为普通文件 4)-s 文件:判断文件是否存在,并且是否为非空 5)其他文件类型判断: -b 块设备文件:-c

linux shell 学习笔记--文件测试符

1. 文件测试操作 ---------------- 返回true 如果... -e 文件存在 -a 文件存在 这个选项的效果与-e 相同.但是它已经被弃用了,并且不鼓励使用 -f file 是一个regular 文件(不是目录或者设备文件) -s 文件长度不为0 -d 文件是个目录 -b 文件是个块设备(软盘,cdrom 等等) -c 文件是个字符设备(键盘,modem,声卡等等) -p 文件是个管道 -h 文件是个符号链接 -L 文件是个符号链接 -S 文件是个socket -t 关联到一个