格式: test conditions
test -n string : string 不为空 
test -z string : string 为空
test int1 -eq int2  : int1 == int 2
test int1 -ne int2  : int1 != int2 
test int1 -gt int2   : int1 > int2 
test int1 -ge int2  : int1 >= int2 
test int1 -lt int2    : int1 < int2 
test int1 -le int2   : int1 <= int2
test -r filename   : 用户对文件filename有读权限
test -w filename  : 用户对文件filename有写权限
test -x filename   : 用户对文件filename有可执行权限
test -f filename   : 文件filename为普通文件
test -d filename  : 文件filename为目录
test -c filename  : 文件filename为字符设备文件
test -b filename  :文件filename为块设备文件
test -s filename  : 文件filename大小不为零
test -t fnumb      : 与文件描述符fnumb(默认值为1)相关的设备是一个终端设备
test ! -s empty   : empty 为空
test -a       : And 
test -o       : Or
注意test命令和[ ]中括号作用是一样的。。
 
 
 
 
test命令用法。功能:检查文件和比较值

  1)判断表达式

  if test  (表达式为真)

  if test !表达式为假

  test 表达式1 –a 表达式2                  两个表达式都为真

  test 表达式1 –o 表达式2                 两个表达式有一个为真

  2)判断字符串

  test –n 字符串                                   字符串的长度非零

  test –z 字符串                                    字符串的长度为零

  test 字符串1=字符串2                    字符串相等

  test 字符串1!=字符串2               字符串不等

  3)判断整数

  test 整数1 –eq 整数2                        整数相等

  test 整数1 –ge 整数2                        整数1大于等于整数2

  test 整数1 –gt 整数2                         整数1大于整数2

  test 整数1 –le 整数2                         整数1小于等于整数2

  test 整数1 –lt 整数2                          整数1小于整数2

  test 整数1 –ne 整数2                        整数1不等于整数2

  4)判断文件

  test  File1 –ef  File2        两个文件具有同样的设备号和i结点号

  test  File1 –nt  File2        文件1比文件2 新

  test  File1 –ot  File2        文件1比文件2 旧

  test –b File        文件存在并且是块设备文件

  test –c File        文件存在并且是字符设备文件

  test –d File        文件存在并且是目录

  test –e File        文件存在

  test –f File         文件存在并且是正规文件

  test –g File        文件存在并且是设置了组ID

  test –G File        文件存在并且属于有效组ID

  test –h File        文件存在并且是一个符号链接(同-L)

  test –k File        文件存在并且设置了sticky位

  test –b File        文件存在并且是块设备文件

  test –L File        文件存在并且是一个符号链接(同-h)

  test –o File        文件存在并且属于有效用户ID

  test –p File        文件存在并且是一个命名管道

  test –r File        文件存在并且可读

  test –s File        文件存在并且是一个套接字

  test –t FD        文件描述符是在一个终端打开的

  test –u File        文件存在并且设置了它的set-user-id位

  test –w File        文件存在并且可写

  test –x File        文件存在并且可执行

  每一种条件语句的基础都是判断什么是真什么是假。是否了解其工作原理将决定您编写的是质量一般的脚本还是您将引以为荣的脚本。

  Shell 脚本的能力时常被低估,但实际上其能力的发挥受制于脚本撰写者的能力。您了解得越多,您就越能像变戏法似地撰写一个文件来使任务自动化和简化您的管理工作。

  在 shell 脚本中进行的每一种操作(除最简单的命令编组之外)都需要检查条件。所有的 shell 脚本“逻辑” — 广义意义下的“逻辑” — 通常都可以分为以下三大类:
if {condition exists} then ...

  while {condition exists} do ...

  until {condition exists} do ...

  无论随后的操作是什么,这些基于逻辑的命令都依靠判断一种条件是否真实存在来决定后续的操作。test 命令是使得在每一种情况下都能够确定要判断的条件是否存在的实用工具。因此,彻底了解这个命令对于撰写成功的 shell 脚本至关重要。

  工作原理

  test 命令最短的定义可能是评估一个表达式;如果条件为真,则返回一个 0 值。如果表达式不为真,则返回一个大于 0 的值 — 也可以将其称为假值。检查最后所执行命令的状态的最简便方法是使用 $? 值。出于演示的目的,本文中的例子全部使用了这个参数。

  test 命令期望在命令行中找到一个参数,当 shell 没有为变量赋值时,则将该变量视为空。这意味着在处理脚本时,一旦脚本寻找的参数不存在,则 test 将报告该错误。

  当试图保护脚本时,您可以通过将所有参数包含在双引号中来解决这个问题。然后 shell 将变量展开,如果变量没有值,那么将传递一个空值给 test。另一种方法是在脚本内增加一个额外检查过程来判断是否设置了命令行参数。如果没有设置命令行参数,那么脚本会告诉用户缺少参数,然后退出。我们 会通过一些例子来更具体地说明所有这些内容。

  test 和 [ 命令

  虽然 Linux 和 UNIX 的每个版本中都包含 test 命令,但该命令有一个更常用的别名 — 左方括号:[。test 及其别名通常都可以在 /usr/bin 或 /bin (取决于操作系统版本和供应商)中找到。

  当您使用左方括号而非 test 时,其后必须始终跟着一个空格、要评估的条件、一个空格和右方括号。右方括号不是任何东西的别名,而是表示所需评估参数的结束。条件两边的空格是必需的,这表示要调用 test,以区别于同样经常使用方括号的字符/模式匹配操作。

  test 和 [ 的语法如下:

  test expression

  [ expression ]

  在这两种情况下,test 都评估一个表达式,然后返回真或假。如果它和 if、while 或 until 命令结合使用,则您可以对程序流进行广泛的控制。不过,您无需将 test 命令与任何其它结构一起使用;您可以从命令行直接运行它来检查几乎任何东西的状态。

  因为它们彼此互为别名,所以使用 test 或 [ 均需要一个表达式。表达式一般是文本、数字或文件和目录属性的比较,并且可以包含变量、常量和运算符。运算符可以是字符串运算符、整数运算符、文件运算符或布尔运算符 — 我们将在以下各部分依次介绍每一种运算符。

  test 文件运算符

  利用这些运算符,您可以在程序中根据对文件类型的评估结果执行不同的操作:

  -b file 如果文件为一个块特殊文件,则为真

  -c file 如果文件为一个字符特殊文件,则为真

  -d file 如果文件为一个目录,则为真

  -e file 如果文件存在,则为真

  -f file 如果文件为一个普通文件,则为真

  -g file 如果设置了文件的 SGID 位,则为真

  -G file 如果文件存在且归该组所有,则为真

  -k file 如果设置了文件的粘着位,则为真

  -O file 如果文件存在并且归该用户所有,则为真

  -p file 如果文件为一个命名管道,则为真

  -r file 如果文件可读,则为真

  -s file 如果文件的长度不为零,则为真

  -S file 如果文件为一个套接字特殊文件,则为真

  -t fd 如果 fd 是一个与终端相连的打开的文件描述符(fd 默认为 1),则为真

  -u file 如果设置了文件的 SUID 位,则为真

  -w file 如果文件可写,则为真

  -x file 如果文件可执行,则为真

 
 
 
 
 

SHELL test [命令用法(二)

2011-10-24 20:23:52|  分类:速记|  标签:|字号大中小 订阅

 
 
原文地址:http://www.examw.com/linux/all/114977/index.html

以下示例显示了此简单操作的运行情况:

  $ ls -l

  total 33

  drwxr-xr-w 2 root root 1024 Dec 5 05:05 LST

  -rw-rw-rw- 1 emmett users 27360 Feb 6 07:30 evan

  -rwsrwsrwx 1 root root 152 Feb 6 07:32 hannah

  drwxr-xr-x 2 emmett users 1024 Feb 6 07:31 karen

  -rw------- 1 emmett users 152 Feb 6 07:29 kristin

  -rw-r--r-- 1 emmett users 152 Feb 6 07:29 spencer

  $

  $ test -r evan

  $ echo $?

  0

  $ test -r walter

  $ echo $?

  1

  $

  由于第一次评估为真 — 文件存在且可读 — 返回值为真,或 0。由于第二次评估的文件不存在,该值为假,返回值不为零。将值指定为零或非零很重要,因为在失败时不会始终返回 1(虽然这是通常返回的值),可能返回一个非零值。

  正如开头所提到的,除了使用 test 外,您还可以用方括号 [ ] 将命令括住来向 shell 发出同样的命令 — 如下所示:

  $ [ -w evan ]

  $ echo $?

  0

  $ [ -x evan ]

  $ echo $?

  1

  $

  同样,第一个表达式为真,第二个表达式为假 — 正如返回值所指示的那样。您还可以使用以下命令将两个文件彼此进行比较:

  file1 -ef file2 测试以判断两个文件是否与同一个设备相连,是否拥有相同的 inode 编号

  file1 -nt file2 测试以判断第一个文件是否比第二个文件更新(由修改日期决定)

  file1 -ot file2 测试以判断第一个文件是否比第二个文件更旧

  以下示例显示了使用这些运算符比较文件的结果:

  $ [ evan -nt spencer ]

  $ echo $?

  0

  $ [ karen -ot spencer ]

  $ echo $?

  1

  $

  名为 evan 的文件比名为 spencer 的文件更新,因而评估为真。类似地,名为 karen 的文件比名为 spencer 的文件更新,因此该评估为假。

  字符串比较运算符

  如标题所示,这组函数比较字符串的值。您可以检查它们是否存在、是否相同或者是否不同。

  String 测试以判断字符串是否不为空

  -n string 测试以判断字符串是否不为空;字符串必须为 test 所识别

  -z string 测试以判断字符串是否为空;字符串必须为 test 所识别

  string1 = string2 测试以判断 string1 是否与 string2 相同

  string1 != string2 测试以判断 string1 是否与 string2 不同

  对任何变量进行的最有用的测试之一是判断它的值是否不为空,可以简单地将其放在 test 命令行中执行这种测试,如下例所示:

  $ test "$variable"

  强烈建议进行此种测试时用双引号将变量括住,以让 shell 识别变量(即使变量为空)。默认情况下执行的基本字符串评估和 -n 测试从功能上讲是相同的,如以下示例所示:

  #example1

  if test -n "$1"

  then

  echo "$1"

  fi

  执行以上例子中的代码将根据 $1 是否存在给出以下结果:

  $ example1 friday

  friday

  $

  $ example1

  $

  如果将代码更改为以下形式,则结果将相同:

  #example2

  if test "$1"

  then

  echo "$1"

  fi

  如下所示:

  $ example2 friday

  friday

  $

  $ example2

  $

  所有这些表明,通常不需要 -n,它代表默认操作。

  要从一个不同的角度来查看各种可能性,您可以用另一个选项来替换 -n,并检查该值是否为空(相对于非空)。这可以用 -z 选项来实现,代码为:

  #example3

  if test -z "$1"

  then

  echo "no values were specified"

  fi

  运行如下:

  $ example3

  no values were specified

  $ example3 friday

  $

  如果在没有命令行参数的情况下运行该程序,而表达式评估为真,那么将执行程序块中的文本。如果在命令行中有值,则脚本退出,不执行任何操作。将评估操作放在脚本的开头非常有用,这可以在可能产生错误的进一步处理之前预先检查变量值

Linux Shell : Test命令参数解析的更多相关文章

  1. linux shell 脚本输入参数解析

    文件名: test.sh #!/bin/bash para="para: "; while [ $# -ge 2 ] ; do case "$1" in --a ...

  2. linux useradd(adduser)命令参数及用法详解(linux创建新用户命令)

    linux useradd(adduser)命令参数及用法详解(linux创建新用户命令) useradd可用来建立用户帐号.帐号建好之后,再用passwd设定帐号的密码.而可用userdel删除帐号 ...

  3. Linux shell tr 命令详解

    该随笔摘自 https://www.jb51.net/article/103892.htm Linux shell tr 命令详解 1. 用途 tr,translate的简写,主要用于压缩重复字符,删 ...

  4. linux中touch命令参数修改文件的时间戳(转)

    linux中touch命令参数不常用,一般在使用make的时候可能会用到,用来修改文件时间戳,或者新建一个不存在的文件,以下是linux中touch命令参数的使用方法: touch [-acm][-r ...

  5. linux中touch命令参数修改文件的时间戳(转载)

    转自:http://os.51cto.com/art/200908/144237.htm linux中touch命令参数不常用,一般在使用make的时候可能会用到,用来修改文件时间戳,或者新建一个不存 ...

  6. Linux中mpstat命令参数详解

    Linux中mpstat命令参数详解 mpstat 是 Multiprocessor Statistics的缩写,是实时系统监控工具.其报告与CPU的一些统计信息,这些信息存放在 /proc/stat ...

  7. linux shell 管道命令(pipe)使用及与shell重定向区别

    管道命令操作符是:”|”,它仅能处理经由前面一个指令传出的正确输出信息,也就是 standard output 的信息,对于 stdandarderror 信息没有直接处理能力.然后,传递给下一个命令 ...

  8. linux shell脚本通过参数名传递参数值

    平常在写shell脚本都是用$1,$2....这种方式来接收参数,然而这种接收参数的方式不但容易忘记且不易于理解和维护.Linux常用的命令都可指定参数名和参数值,然而我们怎样才能给自己的shell脚 ...

  9. Linux shell日常命令和技巧

    转自:http://www.vaikan.com/linux-shell-tips-and-tricks/ 原文:http://www.techbar.me/linux-shell-tips/ 使用L ...

随机推荐

  1. centos7下编译安装nginx1.10

    1.下载pcre 下载地址:ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/ 解压到/usr/local/pcre8.3.9 2.下载ope ...

  2. 运算程序,计算玩判断,Y继续,重复计算,N结束

    #include "stdio.h" void main() { /*定义变量,d1,d2:第一.二个数 fu:符号 p1:接收判断号Y/N p2:接收的p1赋给p1 */ int ...

  3. public static void main(String[] args){} 关于Java main()方法

    是Java程序的入口方法,JVM在运行程序时,会首先查找main()方法. public是权限修饰符,表明任何类或对象都可以访问这个方法: static表明main()方法是一个静态方法,即方法中的代 ...

  4. iscroll的下拉刷新,上拉翻页。

    首先对iscroll的scrollTo方法进行稍微修改如下图: 对iscroll滑动到屏幕边缘不能弹回的bug进行修复,如下代码: function scrollbug() { var self = ...

  5. 淘淘商城_day01_课堂笔记

    今日大纲 聊聊电商行业 电商行业发展 11.11 2015双11: 2016年: 预测:2017年的双11交易额将达到:1400亿 电商行业技术特点 淘淘商城简介 淘淘商城的前身 电商行业的概念 B2 ...

  6. POJ 2656 Unhappy Jinjin

    #include <stdio.h> int main() { ) { int i, n; ; scanf("%d", &n); ) break; ; i &l ...

  7. React Redux学习笔记

    React Router React Router 使用教程 Redux中间件middleware [译]深入浅出Redux中间件 Redux学习之一:何为middleware? ES6 ES6新特性 ...

  8. 《JavaScript网页特效经典300例-高级篇》

    <Javascript网页经典特性300例> 高级篇 第18章:ajax应用 Ajax传输JSON数据实例定义一套自己的Ajax框架 第19章:面向对象的特性 定义一个类利用prototy ...

  9. 关于通过addClass与removeClass用jquery控制有良好兼容的CSS3样式

    hi:)好久不见~最近被jquery的animate对某些CSS3特性不兼容搞的头晕眼花,果断百度,阅读了一些高手的博客后突然发现平常很少用到的addClass和removeClass属性居然还可以这 ...

  10. 推荐一篇很好的介绍wpf dependency property的文章

    http://www.codeproject.com/Articles/140620/WPF-Tutorial-Dependency-Property