2012-06-07 128 views
0

我想重構一些冗長的shell腳本,並且想要消除在函數中聲明但全局使用的任何變量。有沒有辦法快速找到這些變量?確定全局使用哪些變量

另外,有沒有辦法快速找出哪些變量是空的使用?這樣,我可以在函數中排版所有變量,並快速查看所有這些全局使用變量的列表(有一些誤報,但我可以通過這些列表)。

謝謝。

+0

對於ksh,看看'-R'命令行選項'ksh -R outfile script' – cdarke

回答

2

您可能會感興趣set -u對您有幫助。如果一個變量在使用時未被設置,那麼shell將會出錯。這不會幫助您找到使用時爲空字符串的變量,但會找到未設置的變量。

+0

這很好,謝謝。我試過使用ksh -R來運行腳本,但它似乎沒有像常規運行時那樣觀察set -u。你知道有一種方法可以在不實際執行腳本的情況下設置-u強加的錯誤嗎?再次感謝。 – noisesolo

1

我不知道這裏有任何真正的快捷方式,但肯定有一些步驟可以更系統地探索您的腳本。

  1. 使用export -p查找導出的變量。
  2. 腳本中的declare關鍵字的Grep。
  3. 循環通過declare -F和grep聲明語句或變量賦值。
  4. 解析set的輸出以排除您所瞭解的變量和函數,然後調查其餘部分。

這些都不是全面的解決方案,恐怕。但爲了讓你開始:

# Find declare statements in functions. 
for func in $(declare -F | awk '{print $NF}'); do 
    type "$func" | fgrep declare 
done 

希望幫助!

+0

知道沒有快捷鍵也有幫助,我只是不想花時間在所有的時間沒有至少檢查一個預先存在的工具的準備。感謝您的幫助,我會將問題留出一段時間,以查看是否有人碰巧知道某個工具。 – noisesolo

+0

請注意,'declare'由bash使用,但是由ksh使用'typeset'(也由bash支持)。另外,如果對函數'func_name(){...}'使用舊的Bourne shell語法,則ksh93不會對變量進行本地化# – cdarke

+0

感謝您提及有關ksh函數語法的一點。我想知道爲什麼排版不會使變量在本地。 – noisesolo