免费注册 查看新帖 |

Chinaunix

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

关于shell的IFS [复制链接]

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
81 [报告]
发表于 2009-03-24 10:27 |只看该作者
原帖由 blackold 于 2009-3-24 10:18 发表
拜托,我不是对我自己命令问why.


这个不使用IFS吧。


願問其詳。

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
82 [报告]
发表于 2009-03-24 10:31 |只看该作者
我通过eval说明赋值是成功的,而不是65楼所说的赋值不成功。

第一步使用 metacharacter,与IFS没有关系。

[ 本帖最后由 blackold 于 2009-3-24 10:56 编辑 ]

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
83 [报告]
发表于 2009-03-24 10:48 |只看该作者
原帖由 blackold 于 2009-3-24 10:31 发表
我通过eval说明赋是成功的,而不是65所说的赋值不成功。

第一步使用 metacharacter,与IFS没有关系。



還是看不懂...  >_<

eval 沒那麼難理解,簡單來說就是“多層重組”(記得我在13問後面的補充討論中有提到)
也就是第一次重組完成,運行再重組一次。
kenny@x60:~> a=b eval echo \$a
b
kenny@x60:~> echo $a

看第二次的 echo $a 依然沒賦值,你怎反駁 65 樓的說法呢?

運用 eval 那行簡單看成 a=b 是傳給 eval 的就好,而不是傳給 echo 的。
因為 eval 已經獲的 a=b 的值了,因此當 eval 再重組 echo $a 的時候就得到 echo b。
(echo \$a 在第一次 shell 重組已經變成 echo $a 了)


又,
我說的是拆成 word ,看不懂你為何要扯 metacharacter,能否說明白?
消除了誤會討論起來才有交集。

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
84 [报告]
发表于 2009-03-24 11:00 |只看该作者

回复 #83 網中人 的帖子

sorry,刚才漏写了两个字。

将line拆成words( split into tokens)不是根据metacharacter吗?

论坛徽章:
0
85 [报告]
发表于 2009-03-24 11:06 |只看该作者
现在的理解是
a=b echo $a
1、$a先被替换为空:a=b echo
2、空格作为IFS处理:a=b;echo
3、结果:输出一个空行
4、当前shell环境中$a的值为空,a=b并未影响到当前shell环境,这个是bash定义var=str command这种特殊格式命令的结果

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
86 [报告]
发表于 2009-03-24 11:06 |只看该作者
原帖由 blackold 于 2009-3-24 11:00 发表
sorry,刚才漏写了两个字。

将line拆成words( split into tokens)不是根据metacharacter吗?



哦,那我理解您的意思了。

不是的,IFS 的 F 就是 field 的意思。
在英文上,將 field 翻譯成中文,應該是欗位的意思。
不過大家對這個不好理解,所以很多人也就用 word (詞)來代替 field 來說明。如此好理解多了。

Internal Field Separate 就是欗位的分隔符號,也可以理解為 word 的分隔符號。

要是換成用 token ,那更是不好理解。
因此,在討論的時候,如果大家都理解得來的英文術語,我一般都不作翻譯。
怕是翻譯過來反而大家誤會了。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
87 [报告]
发表于 2009-03-24 11:09 |只看该作者
原帖由 ywlscpl 于 2009-3-24 11:06 发表
现在的理解是
a=b echo $a
1、$a先被替换为空:a=b echo
2、空格作为IFS处理:a=b;echo
3、结果:输出一个空行
4、当前shell环境中$a的值为空,a=b并未影响到当前shell环境,这个是bash定义var=str command这 ...


關於 2,
小心那個 ; 號,因為如果用了 ; 就是分成兩個 command line 來處理,也就是
a=b
echo
那跟 a=b echo 是不一樣的。小心。

關於4,
那不應該是空值,而是沒賦值。
抱歉,我剛才在回覆時也講錯了,現在已經修改過來了。

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
88 [报告]
发表于 2009-03-24 11:14 |只看该作者

回复 #86 網中人 的帖子

跑题了:
The following is a brief description of the shell's operation when it
reads and executes a command.  Basically, the shell does the following:

  1. Reads its input from a file (*note Shell Scripts:, from a string
     supplied as an argument to the `-c' invocation option (*note
     Invoking Bash:, or from the user's terminal.

  2. Breaks the input into words and operators, obeying the quoting
     rules described in *Note Quoting::.  These tokens are separated by
     `metacharacters'.  Alias expansion is performed by this step
     (*note Aliases:.
`IFS'
     A list of characters that separate fields; used when the shell
     splits words as part of expansion.

论坛徽章:
0
89 [报告]
发表于 2009-03-24 11:19 |只看该作者

回复 #87 網中人 的帖子

谢谢前辈指教
自己说的很不严谨,第4点变量a是没赋值。
关于第2点,如何验证a=b这条语句是执行过的呢?

发现 a=b echo $a和ls echo $a不一样,前者输出一个空行(a=b是否执行过不太明确),后者其实执行的是ls echo

[ 本帖最后由 ywlscpl 于 2009-3-24 11:23 编辑 ]

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
90 [报告]
发表于 2009-03-24 11:22 |只看该作者
原帖由 blackold 于 2009-3-24 11:14 发表
跑题了:


Thanks for your info.

或許您的理解是對的,只是我對 metacharacter 的定義誤會了。

在我看來,$, space, \, ;, >, *, ... 都是 meta
如果用來做 token 切割,那下面這行:
a=b echo $a 就分成兩個 tokens:
a=b echo
a
然後我就解析不來後面的 expansions 了... >_<

但如果是用 IFS 來切割,就變成三個 tokens:
a=b
echo
$a
如此,$a 就是 variable expansion,而這個時候因為 a 還沒賦值,所以替換不出任何東西。
再重組,就成為:
a=b echo
如此,我還勉強理解也解析得來...
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP