2009-07-13 76 views
1

我有一個bash腳本來源於另一個文件的內容。其他文件的內容是我想要執行的命令並比較返回值。有些命令有多個命令,用分號(;)或和號(& &)分隔,我似乎無法完成這項工作。在這方面努力,我創建了一些測試腳本,如下所示:BASH帶多個命令和可重入的變量

test.conf是文件通過測試

實施例1(本作品)被採購,我的輸出是差分2秒

test.conf

 
    CMD[1]="date" 

test.sh

 
    . test.conf 
    i=2 
    echo "$(${CMD[$i]})" 
    sleep 2 
    echo "$(${CMD[$i]})" 

例2(不工作) test.conf(如上相同的腳本)

 
    CMD[1]="date;date" 

實施例-3(試過,它不起作用或者) test.conf(同上腳本)

 
    CMD[1]="date && date" 

我不t希望我的變量CMD在tick標記內,因爲這樣,這些命令將在調用源代碼時執行,我看不出重新評估該變量的方法。

這個劇本基本上是在通1調用CMD來檢查一番,如果傳遞1,我得到一個錯誤的讀數,我做了一些工作,在腳本來糾正的錯誤讀取和重新執行&重新評估的輸出CMD;通過-2。

這裏是一個例子。在這裏我正在檢查SSHD是否在運行。如果我在通過1時評估CMD [1]時沒有運行,我將啓動它並重新評估CMD [1]。

test.conf

 
    CMD[1]=`pgrep -u root -d , sshd 1>/dev/null; echo $?` 

所以,如果我修改爲我的測試腳本,然後test.conf變爲: 注意:刻度線沒有顯示出來,但它是我的鍵盤下面的〜關口的關鍵。

 
    CMD[1]=`date;date` or `date && date` 

我的劇本是這樣的(處理刻度線)

 
    . test.conf 
    i=2 
    echo "${CMD[$i]}" 
    sleep 2 
    echo "${CMD[$i]}" 

我得到儘管延遲2秒打印兩次相同的日期/時間。因此,CMD沒有得到重新評估。

+1

你的問題是不明確的 - 實際上,我沒有看到這個問題。你究竟想要做什麼,哪裏出錯?你的「示例」,「test.conf CMD [1] = pgrep -u」......使得寶貴的意義不大 - 「源文件」在哪裏?你如何解析參數 - 你看到引號時缺少引號? – 2009-07-13 18:28:33

+0

這是一個測試腳本,而不是實際的。因此,$ i的原因仍然存在(切除 - 過去),這是不明確的。其中x = 0 ... 10的CMD [x]是返回1或0的測試條件;主要是這個過程是否正在運行,與上面給出的pgrep例子類似。除了CMD,我還有一個相應的RESTART [x],在我調用它之後,我重新評估CMD [x]以查看進程是否重新啓動。在其他示例中,我正在檢查是否存在日誌文件。我不想讓這些細節討論這個論壇,但它可能會有幫助。 謝謝! – Eric 2009-07-14 12:16:42

回答

1

首先,除非你需要與老貝兼容,你不應該使用反引號不支持$() - ,然後只有

其次,我不明白你爲什麼要設置CMD[1]但隨後i集調用CMD[$i]2

無論如何,這是一個辦法(和它類似於巴里的答案的一部分):

CMD[1]='$(date;date)' # no backticks (remember - they carry Lime disease) 
eval echo "${CMD[1]}" # or $i instead of 1 
1

從情侶你的問題的行,我本來期望一些這樣的方法:

#!/bin/bash 

while read -r line; do 
    # munge $line 
    if eval "$line"; then 
     # success 
    else 
     # fail 
    fi 
done 

如果你有反引號源,你必須逃脫他們避免過早地進行評價, 。另外,反引號並不是評估代碼的唯一方法 - 如上所示,有eval。也許這是你正在尋找的eval

例如,該行:

CMD[1]=`pgrep -u root -d , sshd 1>/dev/null; echo $?` 

是應當看起來可能是這樣的:

CMD[1]='`pgrep -u root -d , sshd 1>/dev/null; echo $?`' 
+0

這個工程!然而,根據我和你以前的評論(我們同意),我不想在那裏回覆。這個腳本不能在Linux以外的任何其他環境中運行,我無法控制BASH並同意您的可移植性問題! – Eric 2009-07-14 12:19:26