shell的if语句

一、逻辑运算符

逻辑卷标 表示意思
1. 关于档案与目录的侦测逻辑卷标!
-f 常用!侦测『档案』是否存在 eg: if [ -f filename ]
-d 常用!侦测『目录』是否存在
-b 侦测是否为一个『 block 档案』
-c 侦测是否为一个『 character 档案』
-S 侦测是否为一个『 socket 标签档案』
-L 侦测是否为一个『 symbolic link 的档案』
-e 侦测『某个东西』是否存在!
2. 关于程序的逻辑卷标!
-G 侦测是否由 GID 所执行的程序所拥有
-O 侦测是否由 UID 所执行的程序所拥有
-p 侦测是否为程序间传送信息的 name pipe 或是 FIFO (老实说,这个不太懂!)
3. 关于档案的属性侦测!
-r 侦测是否为可读的属性
-w 侦测是否为可以写入的属性
-x 侦测是否为可执行的属性
-s 侦测是否为『非空白档案』
-u 侦测是否具有『 SUID 』的属性
-g 侦测是否具有『 SGID 』的属性
-k 侦测是否具有『 sticky bit 』的属性
4. 两个档案之间的判断与比较 ;例如[ test file1 -nt file2 ]
-nt 第一个档案比第二个档案新
-ot 第一个档案比第二个档案旧
-ef 第一个档案与第二个档案为同一个档案( link 之类的档案)
5. 逻辑的『和(and)』『或(or)』
&& 逻辑的 AND 的意思
|| 逻辑的 OR 的意思
运算符号 代表意义
= 等于 应用于:整型或字符串比较 如果在[] 中,只能是字符串
!= 不等于 应用于:整型或字符串比较 如果在[] 中,只能是字符串
< 小于 应用于:整型比较 在[] 中,不能使用 表示字符串
> 大于 应用于:整型比较 在[] 中,不能使用 表示字符串
-eq 等于 应用于:整型比较
-ne 不等于 应用于:整型比较
-lt 小于 应用于:整型比较
-gt 大于 应用于:整型比较
-le 小于或等于 应用于:整型比较
-ge 大于或等于 应用于:整型比较
-a 双方都成立(and) 逻辑表达式 –a 逻辑表达式
-o 单方成立(or) 逻辑表达式 –o 逻辑表达式
-z 空字符串
-n 非空字符串

二、逻辑表达式

test 命令

使用方法:test EXPRESSION
如:
[[email protected] ~]# test 1 = 1 && echo ‘ok‘
ok
[[email protected] ~]# test -d /etc/ && echo ‘ok‘
ok
[[email protected] ~]# test 1 -eq 1 && echo ‘ok‘
ok
[[email protected] ~]# if test 1 = 1 ; then echo ‘ok‘; fi
ok

注意:所有字符 与逻辑运算符直接用“空格”分开,不能连到一起。

精简表达式

[] 表达式
[[email protected] ~]# [ 1 -eq 1 ] && echo ‘ok‘
ok
[[email protected] ~]# [ 2 < 1 ] && echo ‘ok‘
-bash: 2: No such file or directory
[[email protected] ~]# [ 2 \< 1 ] && echo ‘ok‘
[[email protected] ~]# [ 2 -gt 1 -a 3 -lt 4 ] && echo ‘ok‘
ok
[[email protected] ~]# [ 2 -gt 1 && 3 -lt 4 ] && echo ‘ok‘
-bash: [: missing `]‘
注意:在[] 表达式中,常见的>,<需要加转义字符,表示字符串大小比较,以acill码 位置作为比较。 不直接支持<>运算符,还有逻辑运算符|| && 它需要用-a[and] –o[or]表示
[[]] 表达式
[[email protected] ~]# [ 1 -eq 1 ] && echo ‘ok‘
ok[[email protected] ~]$ [[ 2 < 3 ]] && echo ‘ok‘
ok
[[email protected] ~]$ [[ 2 < 3 && 4 > 5 ]] && echo ‘ok‘
ok

注意:[[]] 运算符只是[]运算符的扩充。能够支持<,>符号运算不需要转义符,它还是以字符串比较大小。里面支持逻辑运算符:|| &&

三、性能比较

bash的条件表达式中有三个几乎等效的符号和命令:test,[]和[[]]。通常,大家习惯用if [];then这样的形式。而[[]]的出现,根据ABS所说,是为了兼容><之类的运算符。以下是比较它们性能,发现[[]]是最快的。

$ time (for m in {1..100000}; do test -d .;done;)
real 0m0.658s
user 0m0.558s
sys 0m0.100s

$ time (for m in {1..100000}; do [ -d . ];done;)
real 0m0.609s
user 0m0.524s
sys 0m0.085s

$ time (for m in {1..100000}; do [[ -d . ]];done;)
real 0m0.311s
user 0m0.275s
sys 0m0.036s

不考虑对低版本bash和对sh的兼容的情况下,用[[]]是兼容性强,而且性能比较快,在做条件运算时候,可以使用该运算符。


四、按位操作运算符

运算符 名称 举例 解释value的值
<< 左移 value=4>>2 4左移2位,value值为16
>> 右移 value=8<<2 8右移2位,value值为2
& 按位与 value=8&&4 8按位与4,value值为0
| 按位或 value=8|4 8按位或4,value值为12
~ 按位非 value=~8 按位非8,value值为-9
^ 按位异或 value=10^3 10按位异或3,value值为9

注: 对于按位非,若求“~a”则结果为-(a+1)举一个详细例子:求“~8”分析由于计算机通常
用补码进行符号运算,[[x]补]补=[x]所以
则8的二进制为00001000 求非为11110111
求反码为1001000求补码为1001001所以最后的结果为1001001,~8 即为-9。

注意:if语句中的[]内需要空格

if [$num -eq 100];then   #错误

if [$num-eq100];then     #错误

if [ $num-eq100 ];then   #错误

if [ $num -eq 100 ];then #正确

if单分支

[[email protected] ~]$ cat test3.sh
#!/bin/bash

read -p "输入你的分数:" num
if [ $num -eq 100 ];then
    echo "恭喜你获得满分"
fi
[[email protected] ~]$

[[email protected] ~]$ ./test3.sh
输入你的分数:100
恭喜你获得满分
[[email protected] ~]$

if双分支

[[email protected] ~]$ cat test4.sh
#!/bin/bash

read -p "输入你的分数:" num
if [ $num -ge 60 ];then
    echo "你及格了"
else
    echo "你不及格"
fi
[[email protected] ~]$
[[email protected] ~]$ ./test4.sh
输入你的分数:70
你及格了
[[email protected] ~]$ ./test4.sh
输入你的分数:59
你不及格
[[email protected] ~]$

if多分支

[[email protected] ~]$ cat test5.sh
#!/bin/bash

read -p "输入你的分数:" num
if [ $num -ge 60 -a $num -lt 100 ];then
    echo "你及格了"
elif [ $num -eq 100 ];then
    echo "恭喜你获得满分"
elif [ $num -lt 60 -a $num -ge 0 ];then
    echo "你不及格"
else
    echo "请重新输入"
fi
[[email protected] ~]$

[[email protected] ~]$ ./test5.sh
输入你的分数:100
恭喜你获得满分
[[email protected] ~]$ ./test5.sh
输入你的分数:99
你及格了
[[email protected] ~]$ ./test5.sh
输入你的分数:59
你不及格
[[email protected] ~]$ ./test5.sh
输入你的分数:-1
请重新输入

时间: 2024-10-14 07:33:29

shell的if语句的相关文章

(九)shell中case语句、程序传参、while

2.2.6.1.case语句(1)shell中的case语句和C语言中的switch case语句作用一样,格式有差异(2)shell中的case语句天生没有break,也不需要break,和C语言中的switch case不同.shell中的case默认就是匹配上哪个执行哪个,不会说执行完了还去执行后面的其他case(就好像shell中的case语言默认都带了break). 2.2.6.2.调用shell程序的传参(1)C语言中可以通过main函数的argc和argv给程序传参(详情参考<4.

Linux中的shell脚本编程---语句控制

概述: shell脚本的语句控制 □前面提到了过程式编程语言有三种过程: 顺序执行:按照顺序一条一条语句执行: 选择执行:按照条件进行选择执行: 循环执行:按照给定的循环条件进行循环执行. □其中,顺序不需要特定的控制,只需按照语句依次执行即可:选择执行,则需要特定的控制语句(如:if,case)来判断执行:循环执行则需要特定的循环控制控制(如:for,while等). 一.使用read 命令来接受输入 □在bash脚本编程过程当中有时程序需要与用户之间进行交互,如提示用户输入一些参数等,此时,

shell条件测试语句实例-测试apache是否开启

终于理解了shell条件测试语句”!=“和"-n"的用法区别,于是有了如下的shell脚本,做为练习. 第一种方法:测试apache是否开启?字符串测试 #!/bin/bash # www.jquerycn.cn web=`/usr/bin/pgrep httpd` if [ -n "$web" ]; //$web返回值是否为空 then echo "httpd is running" else /etc/init.d/httpd start f

shell 的 功能语句--1

[1]说明性语句 (1)shell 程序和语句 shell 程序由零或多条shell语句构成. shell语句包括三类:说明性语句.功能性语句和结构性语句. 说明性语句: 以#号开始到该行结束,不被解释执行 功能性语句: 任意的shell命令.用户程序或其它shell程序. 结构性语句: 条件测试语句.多路分支语句.循环语句.循环控制语句等. (2)说明性语句(注释行) 注释行可以出现在程序中的任何位置,既可以单独占用一行, 也可以接在执行语句的后面. 以#号开始到所在行的行尾部分,都不被解释执

Shell case in语句详解

和其它编程语言类似,Shell 也支持两种分支结构(选择结构),分别是 if else 语句和 case in 语句.在<Shell if else>一节中我们讲解了 if else 语句的用法,这节我们就来讲解 case in 语句. 当分支较多,并且判断条件比较简单时,使用 case in 语句就比较方便了. <Shell if else>一节的最后给出了一个例子,就是输入一个整数,输出该整数对应的星期几的英文表示,这节我们就用 case in 语句来重写代码,如下所示. #!

Shell 编程 条件语句

本篇主要写一些shell脚本条件语句的使用. 条件测试 test 条件表达式 [ 条件表达式 ] 文件测试 -d:测试是否为目录(Directory). -e:测试文件或目录是否存在(Exist). -f:测试是否为文件(File). -r:测试当前用户是否有权限读取(Read). -w:测试当前用户是否有权限写入(Write). -x:测试是否设置有可执行权限(Excute). -nt:判断文件A是否比文件B新. -ot:判断文件A是否比文件B旧. -ef:判断两个文件是否为同一个文件,用来判

Shell 编程 循环语句

本篇主要写一些shell脚本循环语句的使用. for 循环 指定次数 #!/bin/bash for ((i=1;i<=10;i++)) do echo $i done [[email protected] ~]# vim num.sh [[email protected] ~]# chmod +x num.sh [[email protected] ~]# ./num.sh 1 2 3 4 5 6 7 8 9 10 遍历循环 #!/bin/bash TMP=$(cat username.txt

Shell 编程 case语句

本篇主要写一些shell脚本条件语句的使用. 条件测试 test 条件表达式 [ 条件表达式 ] 文件测试 -d:测试是否为目录(Directory). -e:测试文件或目录是否存在(Exist). -f:测试是否为文件(File). -r:测试当前用户是否有权限读取(Read). -w:测试当前用户是否有权限写入(Write). -x:测试是否设置有可执行权限(Excute). -nt:判断文件A是否比文件B新. -ot:判断文件A是否比文件B旧. -ef:判断两个文件是否为同一个文件,用来判

Shell 编程 until语句

本篇主要写一些shell脚本until语句的使用. 计算1-50的和 #!/bin/bash i=0 s=0 until [ $i -eq 51 ];do let s+=i;let i++ done echo $s [[email protected] ~]# vim sum.sh [[email protected] ~]# chmod +x sum.sh [[email protected] ~]# ./sum.sh 1275 为指定用户发送在线消息 #!/bin/bash username

[shell]shell中if语句的使用

转自:http://lovelace.blog.51cto.com/1028430/1211353 bash中如何实现条件判断?条件测试类型:    整数测试    字符测试    文件测试 一.条件测试的表达式:    [ expression ]  括号两端必须要有空格    [[ expression ]] 括号两端必须要有空格    test expression组合测试条件: -a: and -o: or !:  非 二.整数比较: -eq 测试两个整数是否相等 -ne 测试两个整数是