Shell-Script

防止shell腳本掛在一行上

  • May 10, 2022

我編寫了一個 shell 腳本,可以幫助我使用df -h. 我包括下面的程式碼片段

s_arch_1_per=`sshpass -p 'password' ssh root@server_ip_1 "df -h | grep '/Archive_1'| awk '{print $ (NF-1)}'"`

master_per=`sshpass -p 'password' ssh nidhal@server_ip_2 "df -h | grep '/dev/mapper/centos-root'| awk '{print $ (NF-1)}'"`

arch_5_per=`df -h | grep '/archive_1'| awk '{print $ (NF-1)}'`

問題是在本地或遠端系統中,df -h有時由於掛載點損壞而導致執行掛起,從而阻止了我的整個外殼程序完全執行。df -h當在其中一個系統中不起作用時,如何防止我的腳本卡在一行上?如果該行執行時間過長,我希望我的腳本跳過一行並繼續到下一行。

不要將pipedf的輸出輸入grep(這會導致df查詢所有已安裝的文件系統,甚至是那些沒有響應的文件系統 - 例如掛起的 NFS 安裝),df而是將您想要資訊的文件系統作為參數提供。

例如,而不是:

df -h | grep '/Archive_1

利用:

df -h /Archive_1

現在df只嘗試獲取有關/Archive_1掛載點的資訊。您可以使用設備節點或掛載點作為參數。

使用 GNU df,--output如果你想要的只是大小,你也可以使用該選項……所以你不需要使用 awk(刪除第一行,即標題,使用 sed 或其他東西仍然有用,因為 GNU df 沒有’沒有選項來抑制標題輸出)。例如

df -h --output=size /Archive_1 | sed 1d

此外,您不應將反引號用於命令替換。它們已過時且已棄用。改為使用$()

總之,這將是這樣的:

s_arch_1_per=$(sshpass -p 'password' ssh root@server_ip_1 \
                'df -h --output=size /Archive_1 | sed 1d')

最後,您應該在 ssh 中使用基於密鑰的身份驗證,而不是密碼身份驗證。但這是一個不同問題的答案。


順便說一句,如果您仍然想要/需要使用 awk,則需要$在欄位編號之前轉義任何符號,就\$ 好像它在 double-quotes 內一樣。例如\$(NF-1),而不僅僅是$(NF-1).

Shell 的引用是一個 PITA,當您需要執行多個級別的引用時更是如此 - 例如,當您通過 ssh 將引用的 awk 腳本發送到遠端主機時。

請參閱為什麼我的 shell 腳本會因空格或其他特殊字元而窒息?有關 shell 引用的各種有用資訊和提示。

引用自:https://unix.stackexchange.com/questions/702003