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