bash指令碼中使用rm命令時的致命誤區
測試的shell為bash:
如果在shell指令碼中如果使用了一個沒有宣告的變數,或者是一個聲明瞭但是沒有賦值的變數,那麼此時指令碼不會報錯,引用的這個變數也會預設為空,此時,如果指令碼中的rm命令的引數剛好使用了這個變數,那麼可能會造成不可估計的嚴重後果,以下為測試場景(注意:下面的指令碼不要複製到你的系統上面執行,否則系統就掛了):
場景一:
1234 | #!/bin/bash # DIRPATH= rm -rf $DIRPATH /bin/ #使用了一個沒有初始化的變數DIRPATH |
場景二:
123 | #!/bin/bash # rm -rf $DIRPATH /bin/ #使用了一個沒有定義的變數DIRPATH |
上面兩個執行結果是一樣的:指令碼沒報錯,/bin目錄被刪除了,本來是打算刪除某個目錄下的bin目錄,但是卻把系統根目錄下的bin目錄刪掉了,那麼系統也就掛了,還有一種更加致命的情況,那就是執行rm -rf $DIRPATH/,DIRPATH變數沒有宣告或者聲明瞭但是沒有賦值,那麼你的系統根目錄就被刪掉,後果可想而知!
避免的方法:
提醒一下,在shell指令碼中使用到rm命令並且rm命令的引數中有帶有變數時,需要特別注意變數名是否與上面宣告的保持一致,還有一種做法就是:在引用變數的時候使用下面的方法,可以確保變數不會為空。
比如上面的DIRPATH變數,在引用此變數作為rm的引數的時候,使用如下方式:
rm -rf ${DIRPATH:-default}/bin/
${DIRPATH:-default}:表示如果變數DIRPATH沒有被宣告或者已經宣告,但是賦值為空,那麼就使用預設值default,否則就使用DIRPATH初始化的值
原文 http://blog.51cto.com/hjh524/1551733