为 bash 脚本设置 IFS

为 bash 脚本设置 IFS

典型案例是IFS= read
这个主题在这个线程中得到了很好的解释:
为什么在 bash 中命令之前设置变量是合法的?
为了有一个完整的了解,如果你们能解释为什么下面的脚本不能按(我)预期的方式工作,我将非常感激。
my_script:

#!/bin/bash

echo "$var1"
echo -n "$IFS" | xxd -p
echo "$var2"

exit 0

呼叫my_script

var1=foo IFS= var2=bar my_script

输出:

foo
20090a
bar

正如你所看到的IFS,没有改变,仍然设置为默认值。调用 as 时
如何read获得自定义? 先感谢您IFSIFS= read

答案1

根据注释,该示例未IFS在脚本中设置,因为 bash 不允许从环境中导入IFSvariables.c:

  /* Don't allow IFS to be imported from the environment. */
  temp_var = bind_variable ("IFS", " \t\n", 0);
  setifs (temp_var); 

内置命令和非脚本当然,使用 get 分配给IFS,但请记住,这只IFS适用于分词:

shell 将 的每个字符$IFS视为分隔符,并使用这些字符作为字段终止符将其他扩展的结果拆分为单词。如果IFS未设置,或者其值恰好是<space><tab><newline>默认值,则忽略先前扩展结果的开头和结尾处的<space><tab>、 和序列,并且不在开头或结尾处的任何字符序列用于分隔单词。如果具有默认值以外的值,则只要空白字符位于( anwhitespacecharacter) 的值中,单词开头和结尾处的空白字符 space 和 tab 序列就会被忽略。其中任何不是 IFS 空白的字符以及任何相邻的空白字符都会分隔字段。空白字符序列也被视为分隔符。如果 的值为空,则不会发生分词。<newline>IFSIFSIFSIFSIFSIFSIFSIFS

相关内容