标题: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



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-332940-1-1.html




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

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