典型案例是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
获得自定义? 先感谢您IFS
IFS= read
答案1
根据注释,该示例未IFS
在脚本中设置,因为 bash 不允许从环境中导入IFS
variables.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>
IFS
IFS
IFS
IFS
IFS
IFS
IFS
IFS