2012-12-02 84 views
2

我有一個shell腳本,看起來像下面的代碼片段:修改出口變量在shell腳本

... 
export updates=0 

processFiles() { 
    updates=$((updates+1)) 
} 

export -f processFiles 
find $path -exec /bin/bash -c "processFiles '{}'" \; 

echo $updates 

使用是計算的更新,插入和文件數量,以保持。不幸的是,最後的回聲總是打印0.

我已經嘗試在函數中使用導出 - 沒有工作。

+2

變量'updates'在子進程中被修改。父進程永遠不會看到它的修改。現在告訴我們你想要達到的目標,也許還有另一種解決方案比你想要的效率更高。 –

+0

目標是在腳本完成後打印一些「統計信息」。 processFiles可以保持原樣,插入新文件或更新現有文件。所有文件處理完畢後,我想知道每個操作發生的次數。這個統計信息是在查找完成它的職責後打印的,因此在processFiles函數中不可能這樣做。 – sge

回答

1

代替使用find,您可以直接使用bash,前提是您的搜索條件足夠簡單。例如,

for file in *; do 
    processFiles "$file" 
done 

將與參數上的所有文件和當前目錄的目錄執行功能processFiles(除了隱藏的)每個文件和目錄的名稱。如果你需要遞歸其應用到所有文件和目錄和子目錄(除隱藏的),使用globstar外殼選項:

#!/bin/bash 

shopt -s globstar 
shopt -s nullglob 

updates=0 

processFiles() { 
    ((++updates)) 
} 

for file in **; do 
    processFiles "$file" 
done 

echo "$updates" 

如果你只想文件,並沒有目錄,在插入這個for循環:

[[ -f "$file" ]] || continue 

將繼續循環,如果file不是一個文件(即,如果是別的東西,就像一個目錄)。

要通過擴大可變path獲取目錄僅匹配文件,寫你的for循環這樣的:

for file in "$path"/*; do 

(或"$path"/**如果你使用globstar,想遞歸)。

如果您需要更復雜的搜索條件,則始終可以使用extglob選項。如果您還需要包含隱藏文件,請使用dotglob選項。

可以找到有關的參考手冊bash的更多信息,特別是以下部分:

最後一點:如果你真的不喜歡這個100%bash解決方案,並且你還想做點什麼在OP中保留腳本,然後不使用bash變量,而是使用(臨時)文件來存儲需要從一個進程傳遞到另一個進程的值。這是一種便宜的IPC方法,運行良好,但安全實施起來更加困難。

+0

我真的很喜歡這個解決方案!現在只剩下一件事了:當找到最後一個文件時,for循環會啓動。是否有可能修改此解決方案,以便在找到該文件時正確執行該功能(如find -exec)? – sge

+0

@Lorunification我不知道這是否可能......事實上,我真的懷疑這是可能的,但也許有人更聰明會想出更好的(簡單)解決方案。 –

+0

不過,非常感謝你! – sge