免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: Minsic
打印 上一主题 下一主题

关于read命令的一个小问题  关闭 [复制链接]

论坛徽章:
1
数据库技术版块每日发帖之星
日期:2016-01-24 06:20:00
11 [报告]
发表于 2003-11-23 13:03 |只看该作者

关于read命令的一个小问题

thx all

上面的问题是解决了,但偶想着想着,又想不明白了...

IFS=;  那么read a这句将被解释为一个整体,而不是命令+参数的形式,没有read a这样的命令吧,但写成read;a的话, read: missing arguments,虽然是我一厢情愿的想法,这又是为什么?是我对IFS的理解哪里出了错?

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
12 [报告]
发表于 2003-11-23 17:27 |只看该作者

关于read命令的一个小问题

噢,这应该是两个层面上的问题。IFS控制的是输入流的分界,相当于awk中的-F的参数并不影响调用awk的方式一样,IFS并不影响shell命令的调用方式。

论坛徽章:
1
数据库技术版块每日发帖之星
日期:2016-01-24 06:20:00
13 [报告]
发表于 2003-11-24 09:53 |只看该作者

关于read命令的一个小问题

斑竹啊,偶还是不明白... >_<

     IFS   Internal field separators, normally  space,  tab,  and
           newline (see Blank Interpretation section).
......
  Blank Interpretation
     After parameter and command  substitution,  the  results  of
     substitution  are scanned for internal field separator char-
     acters (those found in IFS) and split  into  distinct  argu-
     ments  where  such characters are found. Explicit null argu-
     ments
("" or  '')  are  retained.  Implicit  null  arguments
     (those  resulting  from  parameters that have no values) are
     removed.


以上是man sh得到的其中几段话,哪位帮忙可以解释下explicit null arguments & implicit null arguments,如果可以的话,把这里的第二段话翻译一下  

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
14 [报告]
发表于 2003-11-24 14:36 |只看该作者

关于read命令的一个小问题

嗯... 或許嘗試往這方向思考一下:
1) shell command line 主要是要將整行 line 給 break down 每一個詞(word)。
2) 而詞與詞之區隔符號就是 IFS 。
3) shell 會對 command line 作處理(如提換、quoting、等),完成後再按詞重組。注:別忘了這個"重組"特性。
4) 當你用 IFS 來開頭讀進一個變量值,那,shell 會先整理出這個詞,然後再"重組" command line 。
5) 然而,你將 IFS 換成其他,那 shell 將視你那些 space/tab 為"詞",而不是 IFS 。那在重組時,你可得到這些"詞"。

若你不能理解,那來個簡單實驗看看或可理解:
  1. $ A="   abc"
  2. $ echo $A
  3. abc
  4. $ echo "$A" # note1
  5.    abc
  6. $ old_IFS=$IFS
  7. $ IFS=;
  8. $ echo $A
  9.    abc
  10. -bash-2.05b$ IFS=$old_IFS
  11. $ echo $A
  12. abc
复制代码


noet1:這裡是用 soft quoting 將裡面的 space 關閉,使之不是 metat(IFS),而是一個 literal(white space)。

论坛徽章:
1
数据库技术版块每日发帖之星
日期:2016-01-24 06:20:00
15 [报告]
发表于 2003-11-24 16:45 |只看该作者

关于read命令的一个小问题

非常感谢各位的热心帮助,以上的帖子从我个人角度出发,也看得明白...但是还是有疑问,我继续不明白.........despairful ... T_T

  1. $IFS=;
  2. $read a
  3. ;abc
  4. ;abc
复制代码

为什么结果不是abc,而是;abc...

论坛徽章:
0
16 [报告]
发表于 2003-11-24 17:55 |只看该作者

关于read命令的一个小问题

楼主,我的RESULT和你的不一样
请看:

  1. u1/users/carrier/shell>a=";test"                                
  2. u1/users/carrier/shell>IFS=";"                                 
  3. u1/users/carrier/shell>echo $a                                 
  4. test      
复制代码
                           
不过test前面有一空格

论坛徽章:
0
17 [报告]
发表于 2003-11-24 18:03 |只看该作者

关于read命令的一个小问题

上面没贴好,
多做几个分号,我想知道为什么会出现空格呢?

  1. u1/users/carrier/shell>a=";;;test"                              
  2. u1/users/carrier/shell>IFS=";"                                 
  3. u1/users/carrier/shell>echo $a                                 
  4.    test                                                                        
  5. u1/users/carrier/shell>a="   test"                              
  6. u1/users/carrier/shell>echo $a                                 
  7.    test                                                                        
  8. u1/users/carrier/shell>IFS=" "                                 
  9. u1/users/carrier/shell>echo $a                                 
  10. test                                                                           
  11. u1/users/carrier/shell>
复制代码

为什么会有两样的处理呢?

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
18 [报告]
发表于 2003-11-25 00:19 |只看该作者

关于read命令的一个小问题

嗯,大夥兒都很有嘗試精神哦~~~  ^_^ 加油加油...

只是,後面的問題(含前面),是出在 IFS=; 上。
因為這個 ; 在當前的 command line 上是一個 meta ,並非" ; "符號本身。
因此 IFS=; 是將 IFS 設為 null charactor (不是 space, tab, newline)。

要不要試試:
  1. old_IFS=$IFS
  2. $read A
  3. ;a;b;c
  4. $ IFS=
  5. $ echo $A
  6. ;a;b;c
  7. $ IFS=";"  #note2
  8. $ echo $A
  9. a b c
复制代码

note2: 要關閉 ; 可用 ";" 或 ';' 或 \; 。

论坛徽章:
0
19 [报告]
发表于 2005-09-20 01:52 |只看该作者

关于read命令的一个小问题

[quote]原帖由 "Minsic"][/quote 发表:


得加引号的。

IFS=";"

论坛徽章:
0
20 [报告]
发表于 2005-09-20 08:32 |只看该作者

关于read命令的一个小问题

精彩!
顶……
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP