我需要在字符串中的最後選擇之前提取字符串的一部分:獲取壞替代在Solaris 10上的Bourne shell
NDS=/opt/novell/opt/eDirectory/opt/abc
我只想要/opt/novell/opt/eDirectory/
部分
我以前NDSHOME=${NDS%opt*}
但我在Solaris 10上使用Bourne shell, 進行錯誤替換,儘管此腳本在Linux和AIX上運行良好。 有人可以找到解決辦法嗎?
我需要在字符串中的最後選擇之前提取字符串的一部分:獲取壞替代在Solaris 10上的Bourne shell
NDS=/opt/novell/opt/eDirectory/opt/abc
我只想要/opt/novell/opt/eDirectory/
部分
我以前NDSHOME=${NDS%opt*}
但我在Solaris 10上使用Bourne shell, 進行錯誤替換,儘管此腳本在Linux和AIX上運行良好。 有人可以找到解決辦法嗎?
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/
改爲使用Bourne-Again shell。
我們沒有更改shell的選項,我們只能使用bourne shell。 – gold 2012-01-02 06:16:46
然後你就是SOL。改爲使用'sed'或類似的東西。 – 2012-01-02 06:17:12
的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,'`
(注意用,
而非/
作爲分隔符,所以在該/
字符模式不一定要逃脫。)
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
。
謝謝這真的很有用 – gold 2012-01-03 05:26:31
Solaris上的'/ bin/sh'命令是一個真正的(System V)Bourne Shell。你應該考慮使用Korn Shell(或者甚至是Bash)。 – 2012-01-02 07:37:39