免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5922 | 回复: 14
打印 上一主题 下一主题

[和[[有什么不同 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-01-25 10:58 |只看该作者 |倒序浏览
以下是个人的一些总结,有不同意见欢迎讨论

  1. $ type [
  2. [ is a shell builtin
  3. $ type [[
  4. [[ is a shell keyword

复制代码
也就是说[处理里面的字串是当作参数来处理的,而[[对待其中的字串是当作表达式来处理的
那么当作参数和表达式有什么不同呢?

表达式中不会有wordsplitting 或者glob expansion,而参数处理会有

  1. $ ls
  2. file  file 1        #注意是2个文件(file 和file 1)
  3. $ (foo="file 1";[[ -f $foo ]]&&echo "$foo is a file")
  4. file 1 is a file

  5. ]$ (foo="file 1";[ -f $foo ]&&echo "$foo is a file")   # 这里file 1被分成2个word,所以出错
  6. bash: [: file: binary operator expected
复制代码
再来看看glob expansion

  1. $ touch '*'
  2. $ (foo="*";[ -f $foo ]&&echo "$foo is a file")   #为什么显示too many arguments,因为 *被扩展为所有目录下的文件
  3. bash: [: too many arguments
  4. $ (foo="*";[[ -f $foo ]]&&echo "$foo is a file")  # *被当成普通字符了
  5. * is a file
复制代码
参数传递中<和>会被解析成重定向符号,所以必须转义掉

  1. $ ([ "s" < "l" ]&&echo yes)              #错误使用
  2. bash: l: No such file or directory

  3. $ ([ "s" \> "l" ]&&echo yes)       #正确使用
  4. yes

  5. $ ([[ "s" > "l" ]]&&echo yes)     #而在表达式中比较符号不会被当作重定向符号
  6. yes
复制代码
参数传递中小括号会被分割成token,而在表达式中则会被解析成运算顺序

  1. $ ([ "s" \> "l" -a ( file "l" \> "a" -o "l" \> "p" ) ]&&echo yes)  #(和)必须被转义,以避免参数解析中的不正确分词
  2. bash: syntax error near unexpected token `('

  3. $ ([ "s" \> "l" -a \( "l" \> "a" -o "l" \> "p" \) ]&&echo yes)
  4. yes

  5. $ ([[ "s" > "l" && ( "l" > "a" || "l" > "p" ) ]]&&echo yes; ) #而表达式则不需要考虑这个
  6. yes
复制代码

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
2 [报告]
发表于 2011-01-25 13:12 |只看该作者
总结的很好。

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
3 [报告]
发表于 2011-01-25 15:01 |只看该作者
收藏了……

论坛徽章:
0
4 [报告]
发表于 2011-01-25 15:43 |只看该作者
收藏……

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:51:162015年亚洲杯之阿曼
日期:2015-04-07 20:00:59
5 [报告]
发表于 2011-05-15 00:05 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
6 [报告]
发表于 2011-05-15 15:30 |只看该作者

论坛徽章:
0
7 [报告]
发表于 2011-06-09 20:16 |只看该作者
。。。。没看懂。

论坛徽章:
0
8 [报告]
发表于 2011-06-10 13:54 |只看该作者
收藏一个。。。。

论坛徽章:
0
9 [报告]
发表于 2011-06-10 14:57 |只看该作者
能说下在SHELL里哪些情况下是被作为表达式处理,哪些又是被作为参数处理吗?
谢谢

论坛徽章:
0
10 [报告]
发表于 2011-12-26 11:33 |只看该作者
一直使用[[]]的方法,而不推荐[],原来是这样
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP