Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 如何在BOURNE SHELL中按分隔符拆分和迭代子字符串?_String_Shell_Loops_Split_Sh - Fatal编程技术网

String 如何在BOURNE SHELL中按分隔符拆分和迭代子字符串?

String 如何在BOURNE SHELL中按分隔符拆分和迭代子字符串?,string,shell,loops,split,sh,String,Shell,Loops,Split,Sh,最近,我一直在尝试在Ubuntu中自定义位于~/.profile的shell配置文件。我想做的一件事是: # PATH-like variable containing paths separated by ':' MY_ROOTS=/f/o/o:/b/a/r:/e/t/c for some magic iterating my_root in $MY_ROOTS do; my_bin="$my_root/bin" # add it to PATH! [ -d "$my_

最近,我一直在尝试在Ubuntu中自定义位于
~/.profile
的shell配置文件。我想做的一件事是:

# PATH-like variable containing paths separated by ':'
MY_ROOTS=/f/o/o:/b/a/r:/e/t/c
for some magic iterating my_root in $MY_ROOTS do;
    my_bin="$my_root/bin"
    # add it to PATH!
    [ -d "$my_bin" ] && {
        expr ":$PATH:" : ".*:$my_bin:.*" >/dev/null || PATH="${PATH:+"$PATH:"}$my_bin"
    }
done
因为它在.profile中,所以我需要
迭代
部分与Bourne Shell兼容。很多人都问过这样的问题,但我相信大多数解决方案看起来像是巴什主义。在我花了很多时间在谷歌上搜索之后,我仍然没有找到一个合适的答案。请问您有什么建议吗?

尝试:

OIFS=“$IFS”
如果=:
我的根=/f/o/o:/b/a/r:/e/t/c
我的根在$my_根;做
#您的代码在这里与$my_root
完成
IFS=“$OIFS”

谢谢!是否需要在此处备份和还原IFS?尽管$my_ROOTS中的my_root的
集合可以替换为
。这是变量插值不应使用双引号的少数情况之一;您希望shell对值执行令牌拆分。我可以问最后一个关于IFS的问题吗?据我所知,要将IFS设置为一些特殊字符(如and):
IFS=$'\t\n'
,需要使用ANSI C like字符串。那么双引号是否已经足够安全,可以在这里执行备份还原工作呢?@Pierre明白了。我测试了一些案例,效果很好。所以我想这是最终的解决办法。谢谢!这是一个极端的情况,但值得注意的是,如果
IFS
最初未设置,那么之后
IFS
未设置,而是设置为空字符串。