免费注册 查看新帖 |

Chinaunix

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

再问一个关于shell十三问的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-06-21 16:17 |只看该作者 |倒序浏览
在shell十三问中的第十问,最后作者给大家留了一个问题,
问题如下:

若我將 A 取消,照理說,應該不會送文字才對啊(因為第一個條件就不成立了)...
CODE:
        $ unset A
        $ [ -n "$A" ] && [ "$A" -lt 100 ] || echo 'too big!'
        too big!
為何上面的結果也可得到呢?
又,如何解決之呢?

解决问题的方法可以用command group,
我试了一下,发现用(),命令改为:  [ -n "$A" ] && ( [ "$A" -lt 100 ] || echo "too big!" ),问题得到解决;
可是将()换成{}: [ -n "$A" ] && { [ "$A" -lt 100 ] || echo "too big!" }键入enter后,命令并不结束,而是换行后等待继续输入。
在第七问中,作者讲到:( )称为 nested sub-shell,{}称为 non-named command group,在这里执行的两种结果是不是一个体现,我没有很好的理解,请大家来讨论一下。

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
2 [报告]
发表于 2006-06-21 16:22 |只看该作者
{ [ "$A" -lt 100 ] || echo "too big!" ; }

论坛徽章:
0
3 [报告]
发表于 2006-06-21 16:48 |只看该作者
恩,谢谢斑竹给出解决方法,可是我不明白这个至关重要的分号在这里起到了什么作用。()与{}为什么一个不需加就可以执行,一个必须添加。这两者之间有什么基础知识是需要搞清楚的,请给我解释一下好吗?多谢。

[ 本帖最后由 看图说话 于 2006-6-21 16:49 编辑 ]

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
4 [报告]
发表于 2006-06-21 17:09 |只看该作者
因为()是元字符而{}是保留字
简单的说

{ echo a }
这个}是 echo的命令行参数

{ echo a; }
这个}才与{}形成组合命令

论坛徽章:
0
5 [报告]
发表于 2006-06-21 17:42 |只看该作者
恩,刚刚开始看到解释的时候有种豁然开朗的感觉,不过后来翻看了shell十三问中,第四问有写(){}都属于meta。原文如下:
除了 IFS 與 CR ,常用的 meta 還有:
= :  設定變量。
$ :  作變量或運算替換(請不要與 shell prompt 搞混了)。
> :重導向 stdout。
< :重導向 stdin。
|:命令管線。
& :重導向 file descriptor ,或將命令置於背境執行。
( ):將其內的命令置於 nested subshell 執行,或用於運算或命令替換。
{ }:將其內的命令置於 non-named function 中執行,或用在變量替換的界定範圍。
; :在前一個命令結束時,而忽略其返回值,繼續執行下一個命令。
&& :在前一個命令結束時,若返回值為 true,繼續執行下一個命令。
|| :在前一個命令結束時,若返回值為 false,繼續執行下一個命令。
!:執行 history 列表中的命令
...
请问怎么解释echo后面的这里的{}就被当着保留字,而()则被认为是meta;
第四问中列举的这些meta在什么情况下被看作是meta,而什么情况下被看作是普通的保留字。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
6 [报告]
发表于 2006-06-21 18:35 |只看该作者
具體情況具體分析...
13 問不是一個終極答案, 其中只講述普通情況.
有很多特殊例子需要額外的分析.
比方下面的 $ :
  1. sed -n "/^\$$$$/,$ p" 1.txt
复制代码

[ 本帖最后由 網中人 于 2006-6-24 09:49 编辑 ]

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
7 [报告]
发表于 2006-06-21 19:11 |只看该作者
bash的metacharacter:
|  & ; ( ) < > space tab

ksh的metacharacter:
|  & ; ( ) < > space tab newline

csh的metacharacter:
不清楚

BTW:毛chairman都会出错,不要说netman了

论坛徽章:
0
8 [报告]
发表于 2006-06-21 19:24 |只看该作者
晚上吃饭完毕,洗澡,然后洗衣,上来看论坛。刚刚洗澡的时候还在想很多问题要具体分析,等有点积累后,多实践一下。谢谢斑竹大哥们的赐教。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP