簡體   English   中英

測試命令輸出是否包含帶有“ set -e”的字符串

[英]Test if command output contains string with “set -e”

我需要從shell腳本檢查已使用的RAM百分比。 但是我想使用“ set -e”,這使我成為一個問題。

有兩個版本的免費實用程序,其輸出略有不同。 為了在輸出上使用awk,我通過grepping輸出以僅出現在其中一個中的字符串“ buffers”來檢查哪個自由命令是哪個。 如果沒有這樣的字符串,則命令的退出狀態= 1,這會由於set -e參數而使我的腳本無法執行。

我嘗試在grep命令之后也添加“ || true”,但這總是將退出代碼設置為0,這使我的grep測試無效。

set -e
free -m | grep 'buffers' &> /dev/null || true
if [ $? == 0 ]; then
    MEMORY=$(free -m | awk 'NR==3{printf "%.0f%%", $3*100/($3+$4)}')
else
    MEMORY=$(free -m | awk 'NR==2{printf "%.0f%%", ($2-$7)*100/$2}')
fi
echo $MEMORY

那么如何在不關閉set -e參數的情況下正確執行此操作呢? 也歡迎提出任何更好的主意,以使已用RAM的百分比變為變量。

你能避免失敗的命令造成由於出口set -e如果你將它插入if

if free -m | grep 'buffers' &> /dev/null; then
    MEMORY=$(free -m | awk 'NR==3{printf "%.0f%%", $3*100/($3+$4)}')
else
    MEMORY=$(free -m | awk 'NR==2{printf "%.0f%%", ($2-$7)*100/$2}')
fi
echo $MEMORY

另外, free -m執行兩次也不太好。 您可以將其存儲在變量中以進行重復處理:

free=$(free -m)
if [[ $free =~ buffers ]]; then
    MEMORY=$(awk 'NR==3{printf "%.0f%%", $3*100/($3+$4)}' <<< "$free")
else
    MEMORY=$(awk 'NR==2{printf "%.0f%%", ($2-$7)*100/$2}' <<< "$free")
fi
echo $MEMORY

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM