免费注册 查看新帖 |

Chinaunix

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

[文本处理] [已解决,感谢 450917663]IFS case [复制链接]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-08-05 16:40 |只看该作者 |倒序浏览
本帖最后由 houjun19830610 于 2014-08-09 21:45 编辑

IFS='\'
var="'(]\\{}\$\""

echo $var # '(] {}$"

为何这里的\被替换成了空格,有谁知道为什么么?

论坛徽章:
0
2 [报告]
发表于 2014-08-05 18:43 |只看该作者
本帖最后由 450917663 于 2014-08-05 18:47 编辑

IFS='\'
echo $var   
变量替换   =>  echo   "'(]\\{}\$\""  
反斜杠转义=>  echo '(]\{}$"
命令重组   =>  echo  '(]  {}$"
命令执行   =>  '(]  {}$"

替换与重组,按照分隔符来切分字段,之后重组

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
3 [报告]
发表于 2014-08-05 21:22 |只看该作者
lz是来活跃气氛的么

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
4 [报告]
发表于 2014-08-06 10:13 |只看该作者
回复 2# 450917663


    谢谢你的回复,命令重组这步不明白,可否解释下?谢谢。

论坛徽章:
0
5 [报告]
发表于 2014-08-06 10:28 |只看该作者
回复 4# houjun19830610

按我的理解(可能有所不对 - -):

重组即按照分隔符分割命令以及参数

由于你的IFS设置成斜杠

所以,在  echo '(]\{}$"  这个命令中

会被分成三个部分,即   命令--参数1--参数2

命令      echo
参数1    '(]
参数2    {}$"

所以最后重组成:  echo    '(]    {}$"


   

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
6 [报告]
发表于 2014-08-06 10:34 |只看该作者
回复 5# 450917663


    这个例子是ABS书中的,IFS是默认分隔符,你的意思可否理解为由于默认分隔符为\,(在ABS中把这些称为whitespace),但是重组后为何就成了空格,之间的逻辑关系你还是没说出来,谢谢你的回复。

论坛徽章:
0
7 [报告]
发表于 2014-08-06 11:04 |只看该作者
回复 6# houjun19830610

IFS仅在做变量替换的时候才会生效,而命令行重组是不会依据IFS的,比如
  1. $ IFS=I
  2. $ cdI/etc
  3. -bash: cdI/etc: No such file or directory
复制代码
可以看出,IFS并未生效,因为在拆分与重组的时候,并不是依据IFS的,而是有一组固定的中介字符(包括 white space)来区分出不同字段;

接下来才会对这些字段分别进行其他一些操作,而变量替换就发生在这个阶段,此时IFS才会生效,才会对参数再进行分割,

所以,可以理解为,IFS仅对位置参数起作用:


你的命令的处理过程可以这样去理解

  1. var="'(]\\{}\$\""   
  2.     => '(]\{}$"               # 变量赋值时候进行转义
  3. echo $var                      # 原始命令
  4. echo  +  $var                 # 依据中介符(包括white space)拆分命令
  5. $var  =>  '(]\{}$"           # 变量替换
  6. '(]\{}$" => '(]  +  {}$"    # IFS分割位置参数
  7. echo  +  '(]  +  {}$"        # 命令重组
  8. '(]  {}$"                         # 执行结果
复制代码
如果还是不懂,可以看下这个例子
  1. $ IFS=i
  2. $ var="one tw three four five six seven"
  3. $ for n in $var eight nine;do echo \["$n"\];done
  4. [one tw three four f]
  5. [ve s]
  6. [x seven]
  7. [eight]
  8. [nine]
复制代码
该例在做$var变量替换时,参考了IFS变量,以i区分出了[one tw three four f]、[ve s]及[x seven]三个位置参数,eight及nine 不为所动。
可以看出,IFS仅在做变量替换时候起做用,其他拆分重组都是有shell固定的中介字符来进行。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
8 [报告]
发表于 2014-08-06 12:19 |只看该作者
回复 7# 450917663


    谢谢你的解释。whitespace不单单就是指空格,TAB和空行也是whitespace。所以你说的用IFS里的内容被替换为whitespace(你所说的空格)并未能解释清楚一定是空格。他们之间的逻辑关系还是没能说清楚,不过还是谢谢你的耐心解答。

论坛徽章:
0
9 [报告]
发表于 2014-08-06 14:49 |只看该作者
本帖最后由 450917663 于 2014-08-06 15:07 编辑

回复 8# houjun19830610


你是想问,为什么 \ 被替换后,显示的是空格,而不是tab或者new-line是吧?

  1. $ var=a       a    # 中间是tab
  2. $ echo $var
  3. a a                 # tab变成空格
  4. $ var="a            
  5. >                   # 空行
  6. > b"
  7. $ echo $var
  8. a b                   # 空行变成空格
复制代码
懂了?echo 命令会自动将其whitespace都转成空格显示。

这样解释能懂?



然后就你那些命令

  1. $ IFS='\'
  2. $ var="'(]\\{}\$\""
  3. $ echo $var
  4. '(] {}$"
复制代码
如果你不想后面的变量内容被shell进行拆分重组,可以加上引号,把其当成一个参数,而不会因为IFS原因被拆成2个参数(中间用whitespace分隔,echo显示为空格)

  1. $ echo "$var"
  2. '(]\{}$"
复制代码
由于有quote作用,所以后面变量不会被拆成2个参数,而是一个整体,

不加引号的情况:    命令+参数1+参数2
加上引号的情况:    命令+“参数”

这样显示就正常了




   

论坛徽章:
60
20周年集字徽章-20	
日期:2020-10-28 14:04:3015-16赛季CBA联赛之北京
日期:2016-07-06 15:42:0715-16赛季CBA联赛之同曦
日期:2016-06-12 10:38:0915-16赛季CBA联赛之佛山
日期:2016-05-27 11:54:56黄金圣斗士
日期:2015-12-02 11:44:35白银圣斗士
日期:2015-11-25 14:32:43白银圣斗士
日期:2015-11-23 12:53:352015亚冠之布里斯班狮吼
日期:2015-10-21 16:55:482015亚冠之首尔
日期:2015-09-01 16:46:052015亚冠之德黑兰石油
日期:2015-08-31 11:39:192015亚冠之萨济拖拉机
日期:2015-08-28 21:06:5315-16赛季CBA联赛之广东
日期:2016-07-12 14:58:53
10 [报告]
发表于 2014-08-06 19:35 |只看该作者
回复 7# 450917663


    IFS并未生效,因为在拆分与重组的时候,并不是依据IFS的,而是有一组固定的中介字符(包括 white space)来区分出不同字段!

这个可否有相关的文档介绍?

之前看网中人描述IFS,若從技術細節來看,shell 會依據 IFS(Internal Field Seperator) 將 command line 所輸入的文字給拆解為"字段"(word)。
然後再針對特殊字符(meta)先作處理,最後再重組整行 command line 。
(注意:請務必理解上兩句話的意思,我們日後的學習中會常回到這裡思考。)

看来网中人的说法是错误的.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP