腳本練習3---獲取系統磁盤佔用情況 (順便提一下遇到的管道與循環問題)

首先,先說明下樓主要解決的問題: 利用腳本每天輸出系統盤和數據盤的佔用情況,如果該盤不存在,需要將佔用值賦0,

剛開始樓主想到的腳本很簡單--直接管道+while循環:

#!/bin/bash
disk_used_root=“0”
disk_root_all=“0G”
disk_used_data=“0”
disk_data_all=“0G”

df -h | while read line
do
    line_path=`echo ${line} | awk '{print $6}'`
    if [ $line_path == "/" ]; then
        disk_used_root=`echo ${line} | awk '{print $5}' | cut -f 1 -d "%" `
        disk_root_all=`echo ${line} | awk '{print $2}'`
    fi

    if [ "${line_path:="/ssd"}" == "/data10" ]; then
        disk_used_data=`echo ${line} | awk '{print $5}' | cut -f 1 -d "%"`
        disk_data_all=`echo ${line} | awk '{print $2}'`
    fi
done

echo $disk_used_root
echo $disk_root_all
echo $disk_used_data
echo $disk_data_all

但是一執行就傻了,結果如下:

“0”
“0G”
“0”
“0G”

這。。。內層變量賦值無效???

後來查詢得知 問題出在管道上,原因就是:當while遇到管道的時候,循環體會被fork到另一個子shell去執行,此時while中i被改變,然而循環退出時,父shell的i並沒變,依舊是0,故而會輸出0。

管道+循環真的是一種爛寫法,替代方案可參考https://www.cnblogs.com/f-ck-need-u/p/7431578.html 裏列出的幾種,不過這裏面的方案四樓主沒有試成功,可能是寫的語法有錯誤。

最終經調研,對於該問題的替代方案, 一般都是使用重定向來替代, 包括文件重定向以及命令行重定向,最終樓主的解決方案如下:

#!/bin/bash

while read line
do
    line_path=`echo ${line} | awk '{print $6}'`
    if [ "${line_path:="/sss"}" == "/" ]; then
        disk_used_root=`echo ${line} | awk '{print $5}' | cut -f 1 -d "%" `
        disk_root_all=`echo ${line} | awk '{print $2}'`
    fi

    if [ "${line_path:="/ssd"}" == "/data10" ]; then
        disk_used_data=`echo ${line} | awk '{print $5}' | cut -f 1 -d "%"`
        disk_data_all=`echo ${line} | awk '{print $2}'`
    fi
done <<< "$(df -h)"

注意這裏也有坑,最後一行如果 $(df -h) 不加雙引號,會忽略掉結果中的換行符,導致出錯。

另外 關於幾種 重定向 符號

1. “<>”   一般來說 <以只讀模式打開文件, >以只寫模式打開文件, <>雲算法代表的是以讀取和寫入兩種模式打開給定的文件。

2. “2>&1” 將標準錯誤重定向至標準輸出, 通常用法: make > results 2>&1

3. > 不追加輸入,  >> 追加輸入

4. "<<" 又名“here document”,   具體說明可以見這裏  https://my.oschina.net/u/1032146/blog/146941

 

5. “<<<” 又名 “here string”  解釋如下

由操作符"<<<"和作爲標準輸入的字符串構成,here-string是一個用於輸入重定向的普通字符串。



語法:

#  command <<<  "WORD"

注意:單個單詞不需要引號引用,中間如果有空格的字符串,則需要引號引用起來。

# echo "123456" | passwd  --stdin  root

# passwd --stdin root  <<< "123456"

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章