如何將 shell 指令輸出到變數中?

如何將 shell 指令輸出到變數中?

我正在嘗試編寫一個簡單的腳本:

stat=$(du /home/test/)
for i in "$stat"; do
folder=$("$i" | awk '{print $2}')
mail -s $folder [email protected]
done

我在 shell 中運行腳本,輸出如下:

4       /home/test/.config/mc/mcedit
12      /home/test/.config/mc
16      /home/test/.config

然後,我在循環之前的腳本中插入 echo,輸出如下所示:

4 /home/test/.config/mc/mcedit 12 /home/test/.config/mc 16 /home/test/.config

這是因為沒有雙引號。雙引號的輸出與 shell 中的輸出相同。因此,在循環變數 $folder 中對變數使用雙引號不能如預期運作。相反,它包含列表中的所有值。

如何解決這個問題?

答案1

這是一種實現您所期望的方法,儘管不是使用循環for而是使用while循環:

stat=$(du /home/test/)
echo "$stat" | while read i; do
    folder=$(echo "$i" | awk '{print $2}')
    echo "mail content" | mail -s $folder [email protected]
done

當然,正如Archemar 已經評論的那樣,沒有理由不將輸出直接通過管道du傳輸到循環:

du /home/test/ | while read i; do
    folder=$(echo "$i" | awk '{print $2}')
    echo "mail content" | mail -s $folder [email protected]
done

Awk也不是真的有必要。該腳本可以這樣簡化:

du /home/test/ | while read size folder; do
    echo "mail content" | mail -s "$folder" [email protected]
done

由於您似乎沒有使用目錄大小(這是du設計用來計算的) ,find因此您可以使用:

find /home/test -type d | while read folder; do
    echo "mail content" | mail -s "$folder" [email protected]
done

相關內容