2012-07-06 66 views
1

我正在研究一個bash腳本來增加VPS服務器上的/ tmp,並且我希望使它更清潔/更高效,而無需重複相同的命令,無論哪個選項採摘。以下是它現在的結構:減少在bash腳本中重複的命令

#!/bin/bash 

    showMenu() { 
     echo "1) Increase /tmp size to 1 GB" 
     echo "2) Increase /tmp size to 2 GB" 
     echo "3) Quit" 
} 
    while [ 1 ] 
    do 
     showMenu 
     read CHOICE 
     case "$CHOICE" in 

    "1") 
     /etc/init.d/mysql stop 
     /etc/init.d/httpd stop 
     /etc/init.d/cpanel stop 
     cp -af /var/tmp /var/tmp.bak 
     umount -l /var/tmp 
     umount -l /tmp 
     rm -f /usr/tmpDSK 
     dd if=/dev/zero of=/usr/tmpDSK bs=1M count=1k 
     mkfs.ext3 -F /usr/tmpDSK 
     mount -t ext3 -o nosuid,noexec,loop /usr/tmpDSK /tmp 
     mount -o bind,noexec,nosuid /tmp /var/tmp 
     cp -a /var/tmp.bak/* /tmp/ 
     rm -rf /var/tmp.bak/ 
     chmod 1777 /tmp 
     /etc/init.d/mysql start 
     /etc/init.d/httpd start 
     /etc/init.d/cpanel start 
     df -h 
     exit 1 
     ;; 

    "2") 
     /etc/init.d/mysql stop 
     /etc/init.d/httpd stop 
     /etc/init.d/cpanel stop 
     cp -af /var/tmp /var/tmp.bak 
     umount -l /var/tmp 
     umount -l /tmp 
     rm -f /usr/tmpDSK 
     dd if=/dev/zero of=/usr/tmpDSK bs=1M count=2k 
     mkfs.ext3 -F /usr/tmpDSK 
     mount -t ext3 -o nosuid,noexec,loop /usr/tmpDSK /tmp 
     mount -o bind,noexec,nosuid /tmp /var/tmp 
     cp -a /var/tmp.bak/* /tmp/ 
     rm -rf /var/tmp.bak/ 
     chmod 1777 /tmp 
     /etc/init.d/mysql start 
     /etc/init.d/httpd start 
     /etc/init.d/cpanel start 
     df -h 
     exit 1 
     ;; 

    "3") 
     exit 1 
     ;; 
     esac 
    done 

我基本上只想在這個過程中只啓動一次冗餘命令。你能給我一個想法或想法,以最好的方式來做到這一點?

謝謝。

+1

這很奇怪。代碼已經展示了知識和一個功能的好例子。爲什麼不利用這些知識? – wallyk 2012-07-06 20:15:59

回答

1
#!/bin/bash 

function size_up { 
      /etc/init.d/mysql stop 
      /etc/init.d/httpd stop 
      /etc/init.d/cpanel stop 
      cp -af /var/tmp /var/tmp.bak 
      umount -l /var/tmp 
      umount -l /tmp 
      rm -f /usr/tmpDSK 
      dd if=/dev/zero of=/usr/tmpDSK bs=1M count=${1}k 
      mkfs.ext3 -F /usr/tmpDSK 
      mount -t ext3 -o nosuid,noexec,loop /usr/tmpDSK /tmp 
      mount -o bind,noexec,nosuid /tmp /var/tmp 
      cp -a /var/tmp.bak/* /tmp/ 
      rm -rf /var/tmp.bak/ 
      chmod 1777 /tmp 
      /etc/init.d/mysql start 
      /etc/init.d/httpd start 
      /etc/init.d/cpanel start 
      df -h 
      exit 1 
      ;; 
} 



function showMenu() { 
     echo "1) Increase /tmp size to 1 GB" 
     echo "2) Increase /tmp size to 2 GB" 
     echo "3) Quit" 
} 
while [ 1 ] 
    do 
    showMenu 
    read CHOICE 
    case "$CHOICE" in 
     "1") size_up 1 
     "2") size_up 2 
     "3") exit 1 
     ;; 
    esac 
done 
+0

+1實際寫出來,我太懶惰了。 :) – 2012-07-06 20:16:52

+0

感謝您寫出來。我最終自己做了,但爲了額外的努力給你答案。 – Striketh 2012-07-06 20:21:35

2

聽起來很適合於bash function。將代碼的肉放在一個函數中,然後傳遞一個大小的參數。

+0

你是對的。我知道這是類似的東西,但不記得名字。現在看起來好多了:) – Striketh 2012-07-06 20:21:13

1

這是什麼功能。將您的通用代碼放在一個函數中,並從適當的case選擇中調用它。另一種方法是在case語句中設置標誌並根據標誌執行條件執行。

0

請注意,bash函數有點奇怪。

function abc 
{ 
    global_var=1 
} 

function def 
(
    local_var=1 
) 

注意大括號和parens。使用parens,你的函數在子shell中運行,而使用花括號時,你的函數不會得到唯一的名稱空間!

+0

它不回答這個問題,但很高興知道!見http://stackoverflow.com/questions/2188199/bash-double-or-single-bracket-parentheses-curly-braces – 2012-07-07 04:10:32