shell 比较
整数比较
-eq 等于,如:if [ "$a" -eq "$b" ]
-ne 不等于,如:if [ "$a" -ne "$b" ]
-gt 大于,如:if [ "$a" -gt "$b" ]
-ge 大于等于,如:if [ "$a" -ge "$b" ]
-lt 小于,如:if [ "$a" -lt "$b" ]
-le 小于等于,如:if [ "$a" -le "$b" ]
< 小于(需要双括号),如:(("$a" < "$b"))
<= 小于等于(需要双括号),如:(("$a" <= "$b"))
> 大于(需要双括号),如:(("$a" > "$b"))
>= 大于等于(需要双括号),如:(("$a" >= "$b"))
字符串比较
= 等于,如:if [ "$a" = "$b" ]
== 等于,如:if [ "$a" == "$b" ],与=等价
注意: [[]]和[]中的行为在某些情况下是不同的:
[[ $a == z* ]] # 如果$a 以"z"开头(模式匹配)那么将为true
[[ $a == "z*" ]] # 如果$a 等于z* (字符匹配),那么结果为true
[ $a == z* ] # File globbing 和word splitting 将会发生
[ "$a" == "z*" ] # 如果$a 等于z* (字符匹配),那么结果为true
File globbing 是一种关于文件的速记法,比如"*.c"就是,再如~也是.
但是file globbing 并不是严格的正则表达式,虽然绝大多数情况下结构比较像.
(笔者不太懂, 假如在/tmp目录下有一个a.txt文件,则[ "a.txt" = a.* ]会返回逻辑真,但如果/tmp下有a.txt和a.out两个文件,则这样写Shell会报错)
!= 不等于,如:if [ "$a" != "$b" ]
注意:!= 在[[]]结构中使用模式匹配.
< 小于,在ASCII 字母顺序下.如:
if [[ "$a" < "$b" ]]
if [ "$a" \< "$b" ]
注意:在[]结构中"<"需要被转义.
> 大于,在ASCII 字母顺序下.如:
if [[ "$a" > "$b" ]]
if [ "$a" \> "$b" ]
注意:在[]结构中">"需要被转义.
-z 字符串为空.就是长度为0.
-n 字符串不为空
注意: 对于字符串或数字的比较, 加上双引号("")是没有坏处的, 而且能避免一些不必要的麻烦(请参考,但模式和正则表达式不能加双引号.
混合比较
-a 逻辑与
exp1 -a exp2 如果exp1 和exp2 都为true 的话,这个表达式将返回true
-o 逻辑或
exp1 -o exp2 如果exp1 和exp2 中有一个为true 的话,那么这个表达式就返回true
但在[[]]使用&&和|| 代替-a 和-o, -o 和-a 一般都是搭配test 命令或者[]
看一些例子:
#!/bin/bash
# 数字和字符串比较
# 这里的变量a 和b 既可以当作整型也可以当作是字符串.
# 因为Bash 变量并不是强类型的.
a=
b=
# a,b作为整数进行比较
if [ "$a" -ne "$b" ]
then
echo "$a is not equal to $b"
echo "(arithmetic comparison)"
fi
echo
# a,b作为字符串进行比较
if [ "$a" != "$b" ]
then
echo "$a is not equal to $b."
echo "(string comparison)"
fi
# 在这个特定的例子中,"-ne"和"!="都可以.
exit
#!/bin/bash
# 测试字符串是否为null
# $string1 没被声明和初始化
if [ -n $string1 ]
then
echo "String \"string1\" is not null."
else
echo "String \"string1\" is null."
fi
# 错误的结果.
# 显示$string1 为非空,虽然他没被初始化.
echo
# 给$string1加上双引号再试一下.
if [ -n "$string1" ]
then
echo "String \"string1\" is not null."
else
echo "String \"string1\" is null."
fi
# 这次输出我们预期的结果
echo
if [ $string1 ] # 这次$string1 变成"裸体"的了,相当于[ -n $string1 ]
then
echo "String \"string1\" is not null."
else
echo "String \"string1\" is null."
fi
string1=initialized
if [ $string1 ] # 再来
then
echo "String \"string1\" is not null." else
echo "String \"string1\" is null." fi # 这次输出我们期望的结果 # 但最好还是给字符串加上双引号"", 因为这可以避免不必要的麻烦,也是一种好习惯
shell 比较的更多相关文章
- Shell替换
如果表达式中包含特殊字符,Shell 将会进行替换.例如,在双引号中使用变量就是一种替换,转义字符也是一种替换. #!/bin/bash a= echo -e "Value of a is ...
- Shell特殊变量
$ 表示当前Shell进程的ID,即pid $echo $$ 运行结果 特殊变量列表 变量 含义 $0 当前脚本的文件名 $n 传递给脚本或函数的参数.n 是一个数字,表示第几个参数.例如,第一个参数 ...
- shell变量
定义变量 定义变量时,变量名不加美元符号($),如: variableName="value" 注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样.同时,变量名 ...
- 第一个shell脚本
打开文本编辑器,新建一个文件,扩展名为sh(sh代表shell),扩展名并不影响脚本执行,见名知意就好. #!/bin/bash echo "Hello World !" &quo ...
- shell简介
Shell作为命令语言,它交互式地解释和执行用户输入的命令:作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支. shell使用的熟练程度反映了用户对U ...
- Shell碎碎念
1. 字符串如何大小写转换 str="This is a Bash Shell script." 1> tr方式 newstr=`tr '[A-Z]' '[a-z]' < ...
- MongoDB学习笔记二—Shell操作
数据类型 MongoDB在保留JSON基本键/值对特性的基础上,添加了其他一些数据类型. null null用于表示空值或者不存在的字段:{“x”:null} 布尔型 布尔类型有两个值true和fal ...
- 使用C#给Linux写Shell脚本
在这个逼格决定人格,鄙视链盛行的年头,尤其是咱们IT界,请问您今天鄙视与被鄙视的次数分别是多少?如果手中没有一点压箱的本事,那就只有看的份了.今天我们也要提升下自己的格调,学习些脑洞大开的东西,学完之 ...
- Linux环境下shell和vim中乱码原因及消除办法
shell和vim中乱码原因及消除办法 作者:Jack47 在Linux下开发,经常遇到乱码问题:shell或者vim中显示不了中文,或者能够显示,但不能输入中文.每次都是上网去搜,或者同事告诉我一些 ...
- 【说解】在shell中通过mkfifo创建命名管道来控制多个进程并发执行
背景: 工作中有两个异地机房需要传数据,数据全名很规范,在某个目录下命名为统一的前缀加上编号.如/path/from/file.{1..100}.而机房间的专线对单个scp进程的传输速度是有限制的,比 ...
随机推荐
- UVALive 6665 Dragonas Cruller
题目链接:https://icpcarchive.ecs.baylor.edu/external/66/6665.pdf 题目大意: 有一个3 * 3 的格子: 每个格子上面的数字能够朝上下左右四个方 ...
- 告示:CSDN博客通道支持Windows Live Writer写blog离线好友
尊敬的各位CSDN用户: 您好! 为了更好的服务客户.CSDN已经支持Windows Live Writer离线写博客啦.Windows Live Writer于2014年5月29日正式上线啦!欢迎大 ...
- Unity 利用NGUI2.6.3做技能冷却的CD效果
NGUI非常强大我们今天来学习一下,如何利用NGUI做技能冷却的CD效果.先导入NGUI的插件.没有的话这里有啊NGUI2.6.3下载地址: http://vdisk.weibo.com/s/KLqn ...
- ORACLE表空间bigfile和smallfile
BIGFILE | SMALLFILE Use this clause to determine whether the tablespace is a bigfile or smallfile ta ...
- Web堡垒机
最近研究了一下开源的web堡垒机,涉及两个,一个是gateone(python):一个是Web SSH Proxy(java),简单的对后者进行了改造,使其在登录与linux系统交互的时候,不需要使用 ...
- jQuery事件绑定方法bind、 live、delegate和on的区别
我们试图绑定一些事件到DOM元素上的时候,我相信上面这4个方法是最常用的.而它们之间到底有什么不同呢?在什么场合下用什么方法是最有效的呢? 1.准备知识 当我们在开始的时候,有些知识是必须具备的: 1 ...
- WPF基础
1.Sender 指的是被点击的控件.默认为object类. private void btnc1_Click(object sender, RoutedEventArgs e) { Button b ...
- java实现二叉树的相关操作
import java.util.ArrayDeque; import java.util.Queue; public class CreateTree { /** * @param args */ ...
- 用邻接表实现DFS和BFS
#include <stdio.h> #include <stdlib.h> #define MAXVERTEX 10 typedef char VertexType; //顶 ...
- append, appendTo, after区别(preappend、before与这几个原理相同)
append在被选元素结尾插入内容,是被包围在所选元素的标签内的. <script> $('p').append('<a>http</a>'); </scri ...