【问题标题】:How does IFS work in Bash?IFS 如何在 Bash 中工作?
【发布时间】:2011-03-30 22:25:47
【问题描述】:
#!/bin/bash
# This question is from advanced bash scripting guide section 5.1

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

    # output is '(] {}$"     
    # \ converted to space. Why?

echo "$var"      

    # output is '(]\{}$"      
    # special meaning of \ used, \ escapes \ $ and " RIGHT?

echo
var2="\\\\\""
echo $var2       

    # output is   "         
    # \ converted to space. Why?

echo

    # But ... var2="\\\\"" is illegal. Why?

var3='\\\\'
echo "$var3"     # \\\\

    # Strong quoting works, though. Why?

【问题讨论】:

  • 请格式化您的问题以便我们理解。
  • 抱歉,您有什么不明白的地方?格式如何不正确?
  • 不清楚您帖子的哪些部分是您的问题,哪些部分是脚本。更不用说大部分脚本根本没有格式化。

标签: bash shell ifs


【解决方案1】:
IFS='\'
echo $var        

    # o/p is '(] {}$"     

    # \ converted to space. Why?

因为您告诉 shell 反斜杠是字段分隔符,并且由于您在回显时没有引用 $var,所以它受制于基于 IFS 的 word splitting

echo "$var"      

    # o/p is '(]\{}$"      
    # special meaning of \ used, \ escapes \ $ and " RIGHT ?

您在这里引用了$var,因此不会对其执行word splitting。您的输出正是您告诉 shell var 的内容。即'(]\{}$"

var2="\\\\\""

echo $var2       

    # o/p is   "        
    # \ converted to space. Why?

查看第一个答案

# But ... var2="\\\\"" is illegal. Why?

因为每对反斜杠构成一个文字反斜杠,并且没有剩余的反斜杠可以转义第二个双引号。 shell 不知道怎么处理 3 个双引号。

echo "$var3"     # \\\\

    # Strong quoting works, though. Why ?

查看关于word splitting的第二个答案

注意,您也可以使用字符串文字语法 $''var=$'\'(]\{}$"',这只需要您转义单引号

【讨论】:

  • 我还是一头雾水。为什么在 $ 和 " 之前的 \ 没有在执行 echo $var 时转换为空格?
  • @abc:因为\ 本身不是字符,而是表示转义序列的语法。所以\$\" 告诉shell 你想要一个文字$ 和一个文字"。有必要转义这些,因为 $ 本身对 shell 具有特殊含义,并且您必须转义双引号,因为您已将 var 的值用双引号括起来。它只是\\ ,它是一个文字反斜杠,随后由字段分隔符计数
猜你喜欢
  • 1970-01-01
  • 2022-01-01
  • 2022-01-24
  • 1970-01-01
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
  • 2018-12-05
  • 2011-01-30
相关资源
最近更新 更多