我知道這是一個早已過去「回答」,並與所有尊重eduffy,我想出了一個更好的辦法,我想我會分享它。
eduffy的回答是什麼「錯誤」並不是它錯了,而是它給我施加的是一個痛苦的限制:當ls的輸出被管道化時,有一個隱含的子殼創建,這意味着變量循環退出後,設置在循環內的設置會丟失。因此,如果你想寫一些更復雜的代碼,你會在臀部疼痛處理。
我的解決辦法是採取了「的ReadLine」 功能和寫程序了它在其中您可以指定你可能想要的任何具體的行號從任何給定函數調用的結果。 ......作爲一個簡單的例子,從eduffy的:
ls_output=$(ls -1)
# The cut at the end of the following line removes any trailing new line character
declare -i line_count=$(echo "$ls_output" | wc -l | cut -d ' ' -f 1)
declare -i cur_line=1
while [ $cur_line -le $line_count ] ;
do
# NONE of the values in the variables inside this do loop are trapped here.
filename=$(echo "$ls_output" | readline -n $cur_line)
# Now line contains a filename from the preceeding ls command
cur_line=cur_line+1
done
現在成整齊的小包裝含有並能去你的shell代碼,而不必擔心你的變量的作用域你已經結束了所有的子shell活動價值陷入subhells。
我在gnuc寫了我的readline版本,如果有人想要一個副本,在這裏發佈有點大,但也許我們可以找到一種方法...
希望這有助於 RT
@ʞɔıu,如果答案是錯的,那麼你就可以取消接受它,這樣就不會誤導任何人。 – codeforester
@codeforester - 我編輯說,答案吸了,而不是ʞɔıu。 – eduffy