在 for 循环之前临时更改 IFS

com*_*ium 2 bash for assignment

我知道SHELL允许在命令之前立即进行变量赋值,这样IFS=":" read a b c d <<< "$here_string"有效......

我想知道的是,当使用诸如循环之类的复合语句完成时,这样的赋值是否不起作用?我尝试了类似的方法,IFS=":" for i in $PATH; do echo $i; done但导致语法错误。我总是可以做类似的事情oldIFS="$IFS"; IFS=":"; for....; IFS="$oldIFS",但我想知道是否有任何方法可以使此类内联赋值适用于for循环等复合语句?

Qua*_*odo 5

for是保留字,因此遵循特殊规则

下列字应被视为保留字:

!{ } case do done elif else esac fi for if in then until while

仅当没有引用任何字符并且该词用作:

  • 命令的第一个字

  • caseforin之外的保留字之一后的第一个字

  • case 命令中的第三个字(在这种情况下仅in有效)

  • for 命令中的第三个字(在这种情况下只有indo有效)

如果你试试

IFS=":" for i in $PATH; do echo $i; done
Run Code Online (Sandbox Code Playgroud)

然后根据上面的规则,这不是for循环,因为关键字不是命令的第一个单词。但是您可以获得所需的输出

tr ':' '\n' <<< "$PATH"               #Bash, Ksh, Zsh
printf "%s\n" "$PATH" | tr ':' '\n'   #Any standard shell
Run Code Online (Sandbox Code Playgroud)

wheretr:换行符替换每个。


您可能熟悉这种有效的方法:

while IFS= read -r line; do
Run Code Online (Sandbox Code Playgroud)

while是命令的第一个单词,IFS赋值适用于read,所以一切正常。