linux下for循环怎么退出,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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值