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循环等复合语句?
for是保留字,因此遵循特殊规则:
下列字应被视为保留字:
!{ } case do done elif else esac fi for if in then until while
仅当没有引用任何字符并且该词用作:
命令的第一个字
除case、for或in之外的保留字之一后的第一个字
case 命令中的第三个字(在这种情况下仅in有效)
for 命令中的第三个字(在这种情况下只有in和do有效)
如果你试试
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,所以一切正常。