Sus*_*Pal 6 unix linux shell posix
考虑我打算在任何符合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
Run Code Online (Sandbox Code Playgroud)
我想循环冒号分隔值.在循环中,我想调用一个日志函数,它应该能够回显传递给它的所有参数,并保留每个参数中的多个空格.当我运行此代码时,这是我得到的输出.
debug: token:>> >>:foo
debug: token:>> >>:bar
debug: token:>> >>:baz
Run Code Online (Sandbox Code Playgroud)
好消息是,在这两个空间">> >>"
都被保存下来,因为使用的"$*"
,即引述特殊参数星号作为定义第2.5.2节特殊参数 POSIX.1-2004的.
但坏的是,由于相同的用法,传递给它的三个参数log
现在用冒号(the IFS
)分隔.
我解决了这个问题unset
婷IFS
的内for
循环.
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
Run Code Online (Sandbox Code Playgroud)
现在,输出是我想要的.
debug: token >> >> foo
debug: token >> >> bar
debug: token >> >> baz
Run Code Online (Sandbox Code Playgroud)
但我想知道是否有可能在一些POSIX外壳,取消设置IFS
的内for
循环可以有修改的副作用IFS
的for
循环,而它在进步吗?
例如,我担心某些POSIX shell可能会为我的第二个代码示例生成以下输出.
debug: token >> >> foo
debug: token >> >> bar:baz
Run Code Online (Sandbox Code Playgroud)
如果我的第二个代码示例是安全的,并且保证在所有符合POSIX的shell中产生相同的行为,有人可以通过引用POSIX.1-2004中的相关部分来告诉我吗?
如果我的第二个代码示例不安全,那么我可能不得不满足于此类不会修改的内容IFS
.
log()
{
echo debug: "$*"
}
A=foo:bar:baz
echo "$A" | tr : "\n" | while read i
do
log token ">> >>" "$i"
done
Run Code Online (Sandbox Code Playgroud)
这很安全.
该$A
变量将再次for循环开始执行前都会进行扩展:
for i in foo bar baz
Run Code Online (Sandbox Code Playgroud)
一旦发生这种情况,对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 parameters
IFS=$oldIFS
for i; do
log "$i"
done
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1489 次 |
最近记录: |