| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1264 人关注过本帖
标题:bash 中 read 的问题
只看楼主 加入收藏
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
结帖率:96%
收藏
 问题点数:0 回复次数:6 
bash 中 read 的问题
前几天写脚本的时候,用 read 处理管线的上下文时发现了一个挺令我意想不到的 BUG,虽然后来用 sed 代替了。不过还是想弄清楚是怎么回事。

脚本和結果如下:
$ cat shtest.sh
#! /bin/bash

while read abc ; do
    printf "%s, %s\n" $abc $abc
done <<- EOF
    abc def ghi
    jkl mno pqr
EOF
$ ./shtest.sh
abc, def
ghi, abc
def, ghi
jkl, mno
pqr, jkl
mno, pqr
$

我预期的結果应该是这个样子:
abc def ghi, abc def ghi
jkl mno pqr, jkl mno pqr

差距还是比较大的。为什么会这样?


[ 本帖最后由 pangding 于 2011-2-28 20:16 编辑 ]
搜索更多相关主题的帖子: 上下文 
2011-02-28 20:14
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
嗨……只是输出比较诡异,混淆了视听。其实原因很简单……


printf "%s, %s" $abc $abc
改成
printf "%s, %s" "$abc" "$abc"
就行。

初学者的惯常错误,呵呵~
2011-03-02 11:01
ansic
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:恍惚窈冥
等 级:城市猎人
帖 子:1543
专家分:5367
注 册:2011-2-15
收藏
得分:0 
echo $abc $abc

善人者,不善人之师;不善人者,善人之资。不贵其师,不爱其资,虽智大迷。
2011-03-03 11:29
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
收藏
得分:0 
"$abc" 和 $abc 有什么区别?

~~~~~~~~~~~~~~~好好学习~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2011-03-08 23:45
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
回复 4楼 vfdff
空格有对 bash 来说有语法意义。
bash 先扩展变量的值,然后再传执行命令。像我第一次写的,扩展之后就变成:
printf "%s, %s\n" abc def ghi abc def ghi
printf 看见了六个,参数。它会执行三次 "%s, %s\n" ,直到把给它的参数都用完,输出:
abc, def
ghi, abc
def, ghi
加引号之后,扩展会变成:
printf "%s, %s\n" "abc def ghi" "abc def ghi"
引号里面的东西,bash 不尝试解释。(当然有例外,详见文档中 quoting 一节的说明)
这样 printf 眼中只有两个参数。输出就会如我预期的一样。
2011-03-15 20:37
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
收藏
得分:0 
printf 看见了六个,参数。它会执行三次 "%s, %s\n"
这个是printf函数自己实现的一种机制?

~~~~~~~~~~~~~~~好好学习~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2011-03-16 23:20
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
回复 6楼 vfdff
bash 的文档也没詳細说明这种行为,不过实际用的时候是这样的。
而且 printf(1) 也有类似的行为。

我觉得不推荐使用这种特性吧。确实挺容易混淆人的。
2011-03-18 19:40
快速回复:bash 中 read 的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.011294 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved