2012-01-02 17 views
2

我需要在字符串中的最后选择之前提取字符串的一部分:获取坏替代在Solaris 10上的Bourne shell

NDS=/opt/novell/opt/eDirectory/opt/abc 

我只想要/opt/novell/opt/eDirectory/部分

我以前NDSHOME=${NDS%opt*} 但我在Solaris 10上使用Bourne shell, 进行错误替换,尽管此脚本在Linux和AIX上运行良好。 有人可以找到解决办法吗?

+1

Solaris上的'/ bin/sh'命令是一个真正的(System V)Bourne Shell。你应该考虑使用Korn Shell(或者甚至是Bash)。 – 2012-01-02 07:37:39

回答

0

Solaris'/ bin/sh是臭名昭着的不Posix兼容。

你可以尝试以下解决方法与sed

NDSHOME=`echo "$NDS" | sed 's/^\(.*\)\<opt\>.*$/\1/'` 

注:通常我会用$()代替backtics的命令替换的,但我不认为在Solaris上的工作要么。

编辑 改变它,以便opt不匹配字内边界

$ echo $NDS 
/opt/novell/opt/eDirectory/opt/helicopter 
$ echo "$NDS" | sed 's/^\(.*\)\<opt\>.*$/\1/' 
/opt/novell/opt/eDirectory/ 
+0

谢谢..它正在所有的平台上工作。 – gold 2012-01-02 06:56:40

+0

你应该写“Solaris/bin/sh是臭名昭着的......”。 Solaris本身绝对符合POSIX标准。 – jlliagre 2012-01-02 13:06:17

+0

@ jlliagre够公平的,改变了。 – SiegeX 2012-01-02 17:40:38

0

改为使用Bourne-Again shell。

+0

我们没有更改shell的选项,我们只能使用bourne shell。 – gold 2012-01-02 06:16:46

+1

然后你就是SOL。改为使用'sed'或类似的东西。 – 2012-01-02 06:17:12

1

dirname命令打印所有,但作为参数给出的路径名的最后一个级别。

$ NDS=/opt/novell/opt/eDirectory/opt/abc 
$ NDSHOME=`dirname $NDS` 
$ echo $NDSHOME 
/opt/novell/opt/eDirectory/opt 

(根据需要添加export

编辑:

以上在这种情况下无法正常工作。 OP想要删除最后一个opt之后的路径的所有组件,而不仅仅是最后一个组件。如果它对别人有用,我会把它留在这里。

可能使用dirname在一个循环中,停车时最后一个组件(由basename确定)是'选择':

NDSHOME="$NDS" 
while [ "`basename $NDSHOME`" != opt ] ; do 
    NDSHOME="`dirname $NDSHOME`" 
done 

但是这是比它需要更加复杂; sed是一个更好的解决方案。

SiegeX的答案很好,但它将opt当作一个字符串,而不仅仅是一个路径组件。例如,它会变成

/opt/novell/opt/eDirectory/opt/helicopter 

/opt/novell/opt/eDirectory/opt/helic 

试试这个:

NDSHOME=`echo "$NDS" | sed 's,\(.*\)/opt/.*$,\1,'` 

(注意用,而非/作为分隔符,所以在该/字符模式不一定要逃脱。)

+0

他需要'dirname'两次才能得到他想要的输出 – SiegeX 2012-01-02 07:00:28

+0

在这里它不能确定在opt之后只有一个或两个关卡..它可以是任意数量的关卡。所以,我们不能使用dirname。 – gold 2012-01-02 08:27:17

1

Solaris绝对符合POSIX(以及xpg4和susv3等几个相关标准),但它也非常重视兼容旧版本。

副作用是,当这两个功能在某些方面发生冲突时,默认情况下,受影响的命令不符合POSIX,不会破坏旧版脚本。

如果您想POSIX兼容,没有旧式脚本问题,只是设置PATH这样的:

PATH=/usr/xpg6/bin:/usr/xpg4/bin:/usr/ccs/bin:$PATH 

和你的登录shell设置为/usr/xpg4/bin/sh

或者,如果你并不需要严格遵守,您可能只需使用/bin/ksh作为默认外壳。

对于Solaris 10及更早版本,在新脚本中根本不应该使用/bin/sh

仅供参考,这里是Solaris 10 standards手册页,Solaris 11的一个是here

+0

谢谢这真的很有用 – gold 2012-01-03 05:26:31