shell内置命令test单双括号的区别

1、单括号TEST命令要对变量进行单词分离,当变量值包含空白符时,要用引号将变量括起来;而双括号的TEST命令不会对变量进行单词分离。

以下情况分为变量为单个单词,含有空格的词组。

[[email protected] yujia]# echo $name

hello

[[email protected] yujia]# [ $name = "hello" ]

[[email protected] yujia]# echo $?

0

[[email protected] yujia]# [[ $name = "hello" ]]

[[email protected] yujia]# echo $?

0

[[email protected] yujia]#

得出结论,因为变量只有一个单词嘛,单双括号的单词分离都没有影响到这个变量了。

[[email protected] yujia]# echo $name1

hello world

[[email protected] yujia]# [ $name1 = "hello world" ]

-bash: [: too many arguments

[[email protected] yujia]# echo $?

2

[[email protected] yujia]# [ "$name1" = "hello world" ]

[[email protected] yujia]# echo $?

0

[[email protected] yujia]# [[ $name1 = "hello world" ]]

[[email protected] yujia]# echo $?

0

[[email protected] yujia]#

这次变量是一个词组了,带空格那种了。当我们要测试时,结果发现BASH回应参数太多了,这是怎么回事呢?原来是单引号TEST命令对变量进行单词分离了,结果也就变成了

[ hello world = "hello world" ],多了那个字符串hello,成了字符串world和字符串hello world之间的比较了。因此如果在单括号的TEST命令中的变量含有空格,但它还得和字符串比较,那就必须给变量加个双引号了,这时它就不会发生错误了。而在下面的双括号的TEST命令中,即使变量含有空格又何妨,因为它不能对变量单词进行分离嘛。

2、单方括号的TEST命令,通常用内置的TEST命令来测试表达式的值,TEST命令也被链接到方括号上。这样,既可以使用单独的TEST命令,也可以通过把表达式用单方括号括起来,来测试表达式的值。

[[email protected] yujia]# ll abc

-rw-r--r-- 1 root root 0 Sep 24 08:59 abc

[[email protected] yujia]# test -r abc ; echo $?

0

[[email protected] yujia]# [ -r abc ] ; echo $?

0

[[email protected] yujia]#

3、单括号的TEST命令不对SHELL元字符进行扩展的,而双括号TEST命令则会对SHELL元字符进行扩展的了。

[[email protected] yujia]# name=tom

[[email protected] yujia]# [ $name = t?? ]

[[email protected] yujia]# echo $?

1

[[email protected] yujia]# [[ $name = t?? ]]

[[email protected] yujia]# echo $?

0

[[email protected] yujia]#

4、在双括号的TEST命令当中,如果一个字符串(不管含不含有空格)仅仅是在表达式中作为一个普通字符串,而不是一个模式的一部分,则它也必须用引号括起来。

我的理解是如果一个字符串值(右边那个的了)不加双引号,那这个字符串就是模式来的,如果它里面有含有SHELL元字符,BASH会对它进行扩展。如果字符串加了双引号,那它就是一个很普通的字符串的,即便字符串里面里面含有特殊字符,也就是当普通内容来处理。

[[email protected] yujia]# echo $name

tom

[[email protected] yujia]# echo $name1

tomm

[[email protected]w yujia]# [[ $name = tom ]]

[[email protected] yujia]# echo $?

0

[[email protected] yujia]# [[ $name = tom? ]]

[[email protected] yujia]# echo $?

1

[[email protected] yujia]# [[ $name1 = tom ]]

[[email protected] yujia]# echo $?

1

[[email protected] yujia]# [[ $name1 = tom? ]]

[[email protected] yujia]# echo $?

0

[[email protected] yujia]#

[[email protected] yujia]# [[ $name = "tom" ]]

[[email protected] yujia]# echo $?

0

[[email protected] yujia]# [[ $name = "tom?" ]]

[[email protected] yujia]# echo $?

1

[[email protected] yujia]# [[ $name1 = "tom" ]]

[[email protected] yujia]# echo $?

1

[[email protected] yujia]# [[ $name1 = "tom?" ]]

[[email protected] yujia]# echo $?

1

5、[ express1 –a express2 ] 这是放在单括号的TEST命令中的,因为单的不支持元字符扩展,因此就只能叫做表达式了,它们可以组合构成逻辑测试的,不过与或非使用( -a –o !)的形式。

[[email protected] yujia]# ll mm

-r--r--r-- 2 root root 644 Sep 24 08:48 mm

[[email protected] yujia]# [ -r mm -a -x mm ]

[[email protected] yujia]# echo $?

1

[[email protected] yujia]#

[[pattern1 –a pattern1]] 这是放在双括号TEST命令中的,因为单条式子可以支持元字符嘛,所以可以叫做模式表达式了,也就可以用于复合逻辑了,不过与或非使用(&& || !)的形式了。

[[email protected] yujia]# echo $name
tom
[[email protected] yujia]# [[ $name = [tT]om && $name = t?? ]]
[[email protected] yujia]# echo $?
0
[[email protected] yujia]#

时间: 2024-08-05 15:49:45

shell内置命令test单双括号的区别的相关文章

linux中shell内置命令和外置命令

shell内置命令 无法通过which或者whereis去查找命令的位置 例如cd,cp这些命令是shell解释器内置的命令 当shell内置命令传入shell解释器,shell解释器通过内核获取相关的信息或进行相关的操作 可以通过help [命令]查看内置命令的帮助文档 外置命令 /bin /usr/bin /sbin /usr/sbin 这些目录下的命令 可以通过which或者whereis去查找命令的位置 可以通过man [命令]查看命令的帮助文档 原文地址:https://www.cnb

Linux 基础知识:Bash Shell 内置命令

bash内置命令无须搜寻环境变量$PATH中提供的路径,直接可以执行,因此速度很快. 以下介绍几个简单.必备的命令用法. 1. help 用途:显示所有bash内置命令的列表,或某一个内置命令的用法. 用法: 4help 执行结果:显示所有内置命令的列表. 4help –s 内置命令 执行结果:显示内置命令的语法格式. 用例: help cd 显示cd命令的详细用法. help –s printf printf: printf [-v var] format [arguments] 显示prin

如何查看shell内置命令?

在Linux的命令中提供了一个type命令,可用来查看系统命令是内置还是外部命令: 如图: 看到了吗小伙伴们?如果是出现builtin就是内置命令.就介绍这么多吧!有什么不明白请留言问我!

Linux Bash内置命令大全详细介绍

转自:http://os.51cto.com/art/201006/207329.htm 主要Shell内置命令 Shell有很多内置在其源代码中的命令.这些命令是内置的,所以Shell不必到磁盘上搜索它们,执行速度因此加快.不同的Shell内置命令有所不同. A.2.1  bash内置命令 .:执行当前进程环境中的程序.同source. . file:dot命令从文件file中读取命令并执行. : 空操作,返回退出状态0. alias:显示和创建已有命令的别名. bg:把作业放到后台. bin

Linux内置命令

主要Shell内置命令 Shell有很多内置在其源代码中的命令.这些命令是内置的,所以Shell不必到磁盘上搜索它们,执行速度因此加快.不同的Shell内置命令有所不同. A.2.1 bash内置命令 .:执行当前进程环境中的程序.同source. . file:dot命令从文件file中读取命令并执行. : 空操作,返回退出状态0. alias:显示和创建已有命令的别名. bg:把作业放到后台. bind:显示当前关键字与函数的绑定情况,或将关键字与readline函数或宏进行绑定. brea

Bash基础——内置命令

参考:列出所有Bash Shell内置命令的方法示例 Shell Builtin Commands 前言 Shell有很多内置在其源代码中的命令.由于命令是内置的,所以Shell不必到磁盘上搜索它们.内置命令执行速度更快,不同的Shell内置命令有所不同. 内置命令的类型 Bourne Shell BuiltinsBash Builtin CommandsThe Set BuiltinSpecial Builtins 原文地址:https://www.cnblogs.com/kelamoyuju

shell 的内置命令与外部命令的区别

shell命令通常分为两类: 内置命令(man builtins) 外部命令 下面分析两者的区别. 内置命令: 内部命令被构建在shell之中.当执行shell命令时,内部命令的执行速度非常快.这是因为没有其他的进程因为执行这条命令而被创建.比如说,当我们执行"cd"命令时,没有进程被创建.在执行过程中只是简单的改变当前的目录. 外部命令: 外部命令并没有被构建在shell中.这些可执行的外部命令保存在一个独立的文件当中.当一个外部命令被执行时,一个新的进程即被创建同时命令被执行. 通

shell简单使用(四)内置命令

内置于bash中的命令是内置命令 可用type命令相看是否内置命令. 上面的输出结果中,builtin表示内置命令,alias表示命令别名,file表示外部命令.

【一通百通】Bash的单双括号建议:多用[[]], 少用[]

一. bash [  ] 单双括号 基本要素: Ø  [ ] 两个符号左右都要有空格分隔 Ø  内部操作符与操作变量之间要有空格:如  [  “a”  =  “b”  ] Ø  字符串比较中,> < 需要写成\> \< 进行转义 Ø  [ ] 中字符串或者${}变量尽量使用"" 双引号扩住,避免值未定义引用而出错的好办法 Ø  [ ] 中可以使用 –a –o 进行逻辑运算 Ø  [ ] 是bash 内置命令:[ is a shell builtin 1.测试时逻