2012-07-06 65 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