1. 程式人生 > >bash指令碼中使用rm命令時的致命誤區

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

相關推薦

bash指令碼使用rm命令致命誤區

測試的shell為bash:如果在shell指令碼中如果使用了一個沒有宣告的變數,或者是一個聲明瞭但是沒有賦值的變數,那麼此時指令碼不會報錯,引用的這個變數也會預設為空,此時,如果指令碼中的rm命令的引數剛好使用了這個變數,那麼可能會造成不可估計的嚴重後果,以下為測試場景(注

shell 指令碼獲取命令的輸出

這個主要介紹的方法是獲取命令的輸出內容,而不是命令執行成功與否的返回值。 通常情況下,在shell指令碼中需要獲取命令的輸出內容,然後根據輸出內容判斷下一步的執行操作。 比較常用的一種方式就是, 匹配命令輸出的內容中是否存在某些關鍵字,選擇執行的不同動作。 比較常用的一種方式就是

解決 shell指令碼SCP命令需要輸入密碼的問題

本文轉自:https://blog.csdn.net/u012454773/article/details/72779439 使用金鑰檔案,兩臺機器建立信任 這裡假設主機A(192.168.100.3)用來獲得主機B(192.168.100.4)的檔案。 在主機A上執行如下命令來生成配對金鑰:

在docker容器執行命令,提示找不到命令

在使用docker容器時,有時候裡邊沒有安裝vi,敲vi命令時提示說:vi: command not found,這個時候就需要安裝vi,可是當你敲apt-get install vi命令時,提示: Reading package lists... Done  

Bash Shell常用命令之cut,grep(一)

科研日常中會在Linux系統下使用到很多shell 命令,有很多十分有用的命令。當要實現一個功能時,可能需要非常簡單的幾個單詞和字母即可,在此將自己常用的命令做一總結,方便查閱。 1. 選取命令cut cut主要用來對同一行裡的資料進行分解,對字串切割。 cut -d '分割字元

linux下shell指令碼sed命令使用變數

用linpack做測試,寫了一個指令碼, 因為每次可修改的引數寫在了配置檔案裡,所以腳本里用sed命令來修改配置檔案#測試次數echo “Input Number of tests:”read numt#每次測試的資料規模,測試次數有多少次,這裡應該又多少組數字,中間以空格隔

Shell指令碼cd命令使用

在寫shell指令碼的時候發現cd切換目錄的時候無法切換,程式碼是下面的。 #!/bin/bash #changedir.sh cd /home/firefox pwd我仔細一想,我執行的時候是./changedir.sh來執行的,這樣執行的話終端會產生一個子shell,子

解釋bash指令碼set -e與set -o pipefail的作用

man set中的解釋:       set [--abefhkmnptuvxBCEHPT] [-o option] [arg ...]       set [+abefhkmnptuvxBCEHPT] [+o option] [arg ...]... ...        

Linux shell指令碼執行命令結果賦值給變數&&echo輸出變數是否包含換行符的問題

Linux shell指令碼中執行命令結果賦值給變數&&echo輸出變數是否包含換行符的問題 echo $ret 和 echo "$ret" 區別: 如果是echo $ret,輸出結果為一行,沒有換行符 如果是echo "$ret",輸出結果為多行,有換行符

shell指令碼cd命令無效的解決方案

在學習的時候,經常要切換到固定的資料夾,於是寫了個shell指令碼用cd命令切換卻發現目錄切換不了。 程式碼如下: #! /bin/bash # c.sh cd /mnt/hgfs/vmsha

linux shell指令碼cd命令無效的解決方法

      今天需要快速切換目錄,然後在sh腳本里面加入cd,但發現執行後無效。原因就不深究了。然後查了一下,有三種解決方案。       方案一、source ./    格式   例如:so

Bash指令碼進位制轉換

修改指令碼時,想直接用10進位制轉換為16進位制的方法,在網上搜了搜,結果是找到了,可惜所用系統中沒有對應的指令,還是用不成,最後就用了一個比較笨一點的方法。 既然有需要,就把搜到感覺有用的進位制轉換函式或指令都貼在這裡,便於以後應用。 shell可以在不呼叫第3方命

Shell指令碼make命令的使用

    (最近開發的專案中需要編寫Shell指令碼對整個工程進行自動化編譯,即在Shell

Bash 指令碼的 set -euxo pipefail

有些開發人員會用Bash來實現很複雜的功能,就像使用別的高階語言一樣。他可能覺得自己很牛逼但其他人早就想錘爆他了,Bash的可讀性和可維護性遠遠低於任何高階語言。更要命的是,Bash並沒有方便的除錯工具和防錯機制,出了問題你要排查半天。 在Ruby或者Python等高階語言裡,你很容易知道錯誤是哪行什麼型別

Linux 桌面玩家指南:06. 優雅地使用命令列及 Bash 指令碼程式語言的美學與哲學

特別說明:要在我的隨筆後寫評論的小夥伴們請注意了,我的部落格開啟了 MathJax 數學公式支援,MathJax 使用$標記數學公式的開始和結束。如果某條評論中出現了兩個$,MathJax 會將兩個$之間的內容按照數學公式進行排版,從而導致評論區格式混亂。如果大家的評論中用到了$,但是又不是為了使用數學公式

bash 指令碼程式設計七 將命令輸出儲存到變數

`符號包含的命令執行完後,可以講其輸出結果儲存到變數中#!/bin/bash v=`java -version` echo $v 執行結果:$ ./install.sh java version "1.6.0_34" Java(TM) SE Runtime Environ

bash命令的執行關系

bash多命令執行關系bash的多命令執行的邏輯關系; 1.命令替換 COMMAND1 $(COMMAND2)[root@localhost ~]# cp -a /etc /tmp/etc-$(date +‘%F-%T‘) [root@localhost ~]# ls /tmp etc-2

Linux如何恢復rm命令誤刪除的文件之extundelete編譯安裝及使用

可用 並且 地址 cat inode res 丟失 lin 所在 1、下載extundelete包,安裝依賴 我用的是Centos系統,在安裝extundelete之前需要安裝e2fsprogs,e2fsprogs-libs,e2fsprogs-devel。 yum in

Bash Shell命令行選項/OA現金盤平臺租用

pre getopts 命令 描述 onf 列表 don 個數 相同 寫程序的時候經常要處理命令行參數,本文描述在Bash下的命令行處理方式。 選項與參數: OA現金盤平臺租用(企 娥:217 1793 408) 如下一個命令行: . / test.sh - f con

運行fdisk命令,彈出 bash:fdisk:command not found

彈出 spa comm 再次 home x11 strong str 圖片 原因:命令fdisk 不在你的命令搜索路徑中 第一種解決辦法,將fdisk添加到你的命令搜索路徑中 首先查看你當前的命令搜索路徑: [root@host sbin]# echo $PATH/usr/