2012-06-18 73 views
1

我正在將腳本從HP-UX移植到LINUX。當我嘗試源腳本,bash的抱怨在LINUX bash中,等同於排版-l和排版-u?

bash: typeset: -u: invalid option 
typeset: usage: typeset [-afFirtx] [-p] name[=value] ... 

typeset: usage: typeset [-afFirtx] [-p] name[=value] ... 
./install_profile: line 237: typeset: -l: invalid option 

從我所看到的,排版是用來賦值給一個變量,雖然我不太明白什麼typeset -utypeset -l做具體那是不同的從一般的任務,如foo =「bar」。

我想知道是否有一些等效的方式來表達typeset -utypeset -l的LINUX bash,因爲它看起來不兼容bash。

作爲替代,我想知道是否可以將排版命令識別爲ksh命令,因爲它看起來排版來自ksh。

謝謝。

+0

您使用的是什麼版本的bash,因爲我無法重現該問題。 'typeset -u'和'typeset -l'在這裏工作正常在Debian上使用bash版本4.1.5 – dwalter

回答

2

你將從哪個版本的bash移植到? typeset -l使變量,使任何分配轉換爲大寫小寫; typeset -u將低位轉換爲高位。我懷疑這些選項被添加到bash大約在第4版

+0

我使用的是舊版本的bash(即GNU bash,版本爲3.2.39(1) - 版本(i586- suse-linux-gnu) Copyright(C)2007 Free Software Foundation,Inc.) – Justin

+0

你走了。如果你不能升級到更新版本的bash,只需將'-l'和'-u'從調用中排版。但是,請記住腳本的其餘部分將假定相關變量都是大寫(或小寫,因此)。要麼找到另一種方法來進行轉換,要麼調整腳本以明確檢查情況。 – chepner

+0

謝謝,你的回答幫我找到了相關的答案! – Justin

2

typeset -l-u行爲基本都在猛砸,ksh93的,和mksh,在那裏它們引起同樣的字符串在分配時分別轉換爲較低或較大的字符串。在ksh中,它們還作爲長整型和浮點型的修飾符,這些不是常見的shell特徵(Bash沒有這些特徵)。通常不鼓勵使用-u-l,特別是在大型腳本中,它們可以讓錯誤滑入。大多數情況下,使用case-modification參數擴展有更好的替代方案。

typeset根據Bash是declare的同義詞(Bash認爲typeset已棄用 - IMO這不是主要問題)。他們之間有很多顯着的差異,除非你注意瞭解他們的確切行爲,否則他們通常應該被認爲是不相容的。在這兩個shell中,它們在定義數據類型(Bash,zsh和mksh都有一些不重疊的支持,比ksh93更有限)中扮演着重要角色。

另外,在Linux下安裝ksh93(或整個AST工具包)沒有問題,並且可能不需要將腳本移植到Bash,除非您真的想要。在Linux下,Bash更受歡迎,主要是出於歷史原因,並且在某種程度上,是授權(copyleft)。