linux – 为for循环设置IFS然后在for循环中取消设置是否安全?
考虑我打算在任何符合
POSIX.1-2004的shell上运行的以下shell脚本.
log() { echo debug: "$*" } A=foo:bar:baz IFS=: for i in $A do log token ">> >>" "$i" done unset IFS # Do more stuff here 我想循环冒号分隔值.在循环中,我想调用一个日志函数,它应该能够回显传递给它的所有参数,并保留每个参数中的多个空格.当我运行此代码时,这是我得到的输出. debug: token:>> >>:foo debug: token:>> >>:bar debug: token:>> >>:baz 好的是“>>>>”中的两个空格因为使用“$*”而被保留,即在POSIX.1-2004的Section 2.5.2 Special Parameters中定义的引用特殊参数星号. 但坏的是,由于相同的用法,传递给log的三个参数现在用冒号(IFS)分隔. 我通过在for循环中取消设置IFS来解决这个问题. log() { echo debug: "$*" } A=foo:bar:baz IFS=: for i in $A do unset IFS log token ">> >>" "$i" done unset IFS # Do more stuff here 现在,输出是我想要的. debug: token >> >> foo debug: token >> >> bar debug: token >> >> baz 但是我想知道是否有可能在某些POSIX shell中,在for循环中取消设置IFS可能会在for循环中产生修改for循环的IFS的副作用? 例如,我担心某些POSIX shell可能会为我的第二个代码示例生成以下输出. debug: token >> >> foo debug: token >> >> bar:baz 有人可以通过引用POSIX.1-2004中的相关部分告诉我,如果我的第二个代码示例是安全的,并且是否保证在所有符合POSIX的shell中产生相同的行为? 如果我的第二个代码示例不安全,那么我可能不得不满足于不修改IFS的类似内容. log() { echo debug: "$*" } A=foo:bar:baz echo "$A" | tr : "n" | while read i do log token ">> >>" "$i" done 解决方法
这很安全.
在for循环开始执行之前,$A变量将被展开一次: for i in foo bar baz 一旦发生这种情况,对IFS的任何更改都将无效. 参考文献: 如果您只使用IFS来解析该字符串,则可以执行以下操作: oldIFS=$IFS IFS=: set -- $A # save the elements of the list as positional parameters IFS=$oldIFS for i; do log "$i" done (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |