linux – 为for循环设置IFS然后在for循环中取消设置是否安全?

linux – 为for循环设置IFS然后在for循环中取消设置是否安全?,第1张

概述考虑我打算在任何符合 POSIX.1-2004的shell上运行的以下shell脚本. log(){ echo debug: "$*"}A=foo:bar:bazIFS=:for i in $Ado log token ">> >>" "$i"doneunset IFS# Do more stuff here 我想循环冒号分隔值.在循环中,我想调用一个日志函 考虑我打算在任何符合 POSIX.1-2004的shell上运行的以下shell脚本.
log(){    echo deBUG: "$*"}A=foo:bar:bazIFS=:for i in $Ado   log token ">>  >>" "$i"doneunset IFS# Do more stuff here

我想循环冒号分隔值.在循环中,我想调用一个日志函数,它应该能够回显传递给它的所有参数,并保留每个参数中的多个空格.当我运行此代码时,这是我得到的输出.

deBUG: token:>>  >>:foodeBUG: token:>>  >>:bardeBUG: token:>>  >>:baz

好的是“>>>>”中的两个空格因为使用“$*”而被保留,即在POSIX.1-2004的Section 2.5.2 Special Parameters中定义的引用特殊参数星号.

但坏的是,由于相同的用法,传递给log的三个参数现在用冒号(IFS)分隔.

我通过在for循环中取消设置IFS来解决这个问题.

log(){    echo deBUG: "$*"}A=foo:bar:bazIFS=:for i in $Ado   unset IFS   log token ">>  >>" "$i"doneunset IFS# Do more stuff here

现在,输出是我想要的.

deBUG: token >>  >> foodeBUG: token >>  >> bardeBUG: token >>  >> baz

但是我想知道是否有可能在某些POSIX shell中,在for循环中取消设置IFS可能会在for循环中产生修改for循环的IFS的副作用?

例如,我担心某些POSIX shell可能会为我的第二个代码示例生成以下输出.

deBUG: token >>  >> foodeBUG: token >>  >> bar:baz

有人可以通过引用POSIX.1-2004中的相关部分告诉我,如果我的第二个代码示例是安全的,并且是否保证在所有符合POSIX的shell中产生相同的行为?

如果我的第二个代码示例不安全,那么我可能不得不满足于不修改IFS的类似内容.

log(){    echo deBUG: "$*"}A=foo:bar:bazecho "$A" | tr : "\n" | while read ido   log token ">>  >>" "$i"done
解决方法 这很安全.

在for循环开始执行之前,$A变量将被展开一次:

for i in foo bar baz

一旦发生这种情况,对IFS的任何更改都将无效.

参考文献:
http://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html#tag_02_06
http://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html#tag_02_06_05

如果您只使用IFS来解析该字符串,则可以执行以下 *** 作:

oldIFS=$IFS IFS=:set -- $A           # save the elements of the List as positional parametersIFS=$oldIFSfor i; do    log "$i"done
总结

以上是内存溢出为你收集整理的linux – 为for循环设置IFS然后在for循环中取消设置是否安全?全部内容,希望文章能够帮你解决linux – 为for循环设置IFS然后在for循环中取消设置是否安全?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/1049316.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存