歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> SHELL編程

shell自動清空創建並格式化硬盤

要求如下:

寫一個shell腳本:

1、創建一個函數,可以接受一個磁盤設備路徑(如/dev/sdb)作為參數;在真正開始後面步驟之前提醒用戶有危險,並讓用戶選擇是否繼續;
而後將此磁盤設備上的所有分區清空(提示,使用命令dd if=/dev/zero of=/dev/sdb bs=512 count=1實現,注意其中的設備路徑不要寫錯了);如果此步驟失敗,返回67給主程序;
接著在此磁盤設備上創建兩個主分區,一個大小為100M,一個大小為1G;如果此步驟失敗,返回68給主程序;
格式化此兩分區,文件系統類型為ext3;如果此步驟失敗,返回69給主程序;
如果上述過程都正常,返回0給主程序;
2、調用此函數;並通過接收函數執行的返回值來判斷其執行情況,並將信息顯示出來;

代碼如下:

  1. #!/bin/bash  
  2. #Author: MOS  
  3. #Script name: funPart.sh  
  4. #Date & Time: 2012-10-10/12:20:53  
  5. #Version: 1.0.1  
  6. #Description:  
  7. #  
  8. Disk_Mod(){  
  9. #使用if匹配模式,使用for循環判斷是否存在,如果有,則取其絕對路徑,跳出循環,如果不匹配或文件不存在,跳出函數,返回66  
  10. if [[ -n $1 && $1 =~ "/dev/sd[a-z]" ]];then 
  11.     local Darray=(`ls /dev/sd[a-z]`)  
  12.     for i in ${Darray[*]};do  
  13.         [[ "$i" == "$1" ]] && Sd=$i && break  
  14.     done  
  15. else 
  16.     return 66  
  17. fi  
  18. #當匹配成功,進入選擇,告訴用戶,是否繼續,輸錯的話進入無限循環,當用戶選擇Y,則清空目標分區,且跳出while循環  
  19.     while :;do  
  20.         read -p "Warning!!!This operation will clean $Sd data. Next=y,Quit=n [y|n]: " Choice  
  21.         case $Choice in 
  22.         y)  
  23.             dd if=/dev/zero of=$Sd bs=512 count=1 &> /dev/null && break || return 67 ;;  
  24.         n)  
  25.             exit 88 ;;  
  26.         *)  
  27.             echo "Invalid choice,please choice again." ;;  
  28.         esac  
  29.     done  
  30. #使用echo傳遞給fdisk進行分區,如果此命令失敗,則跳轉出去,錯誤值68,需要注意的是,有時候這個返回值很詭異,筆者之前成功與否都是返回的1,後來重啟之後,就好了,如果慎重的話,可以對創建的分區,進行判斷,不過就需要使用其他工具截取相關字段了,雖有些小麻煩,但無大礙  
  31. echo -e "n\np\n1\n\n+100M\nn\np\n2\n\n+1024M\nw\n"|fdisk /dev/sdb &> /dev/null || return 68   
  32. #格式化之前,讓內核重新讀取磁盤分區表,值得注意的是,有的系統版本,使用partprobe無效,譬如筆者的環境是rhel5.8,而rhel6.0以後,這個命令就很危險了,而使用partx -a /dev/sdb則效果更好...此項需慎重,如果格式化失敗,則告知把失敗的分區定義成變量,且跳出函數,並帶出錯誤值69  
  33.     `partprobe`  
  34.     Part=`fdisk -l /dev/$Sd|tail -2|cut -d" " -f1`  
  35.     for M in ${Part[*]};do  
  36.         ! mke2fs -j $M &> /dev/null && ErrorPart=$M && return 69  
  37.     done  
  38. return 0  
  39. }  
  40. #下面代碼,調用函數,接收函數返回值,根據返回值進行判斷哪裡出錯。  
  41. Disk_Mod $1  
  42. Res=$?  
  43. [ $Res -eq 0 ] && exit 0  
  44. [ $Res -eq 66 ] && echo "Error! Invalid input." 
  45. [ $Res -eq 67 ] && echo "Error! Command -> dd <- Faild." 
  46. [ $Res -eq 68 ] && echo "Error! Command -> fdisk <- Faild." 
  47. [ $Res -eq 69 ] && echo "Error! Command -> mke2fs <- Faild."
Copyright © Linux教程網 All Rights Reserved