2012-01-02 20 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