2011-08-19 26 views
19

Tôi đã có kịch bản sau vỏ đó là nghĩa vụ chỉ đơn giản là sân khấu một vài Java .ear/file .WAR để JBoss:Sự khác nhau giữa "else if" và "elif" trong bash là gì?

SUCCESS=false 
DEPLOY_PATH=/apps/jboss/server/default/deploy 

E_NOARGS=75 
M_USAGE="usage: $0 {rcm|hcm}" 
M_MISSING_RCM="missing: rcm.war file not present" 
M_MISSING_HCM="missing: hcm.ear or hcm.war file not present" 

if [ -z "$1" ] 
then 
    echo $M_USAGE 
    exit $E_NOARGS 
else 
    M_START="deploying $1 ..." 
    M_FINISH="finished deploying $1" 
fi 

until [ -z "$1" ] 
do 
    echo $M_START 
    case "$1" in 
    rcm*) 
     # do a hot-deploy of the rcm.war file 
     # TODO: test if rcm.war file is present, error out if not 
     if [ -e rcm.war ] 
     then 
     cp -v rcm.war $DEPLOY_PATH/rcm.war 
     SUCCESS=true 
     else 
     echo $M_MISSING_RCM 
     fi 
     ;; 
    hcm*) 
     # do a shutdown, deploy hcm.war, and restart jboss 
     ps -ef | awk '/jboss/{print $2}' | xargs kill -s KILL 

     HCM_DEPLOYED=false 

     if [ -e hcm.ear ] 
     then 
     cp -v hcm.ear $DEPLOY_PATH/hcm.ear 
     HCM_DEPLOYED=true 
     else 
     if [ -e hcm.war ] 
     then 
      cp -v hcm.war $DEPLOY_PATH/hcm.war 
      HCM_DEPLOYED=true 
     else 
      echo $M_MISSING_HCM 
     fi 
     fi 

     if $HCM_DEPLOYED ; 
     then 
     # TODO: detect the hostname 
     nohup /apps/jboss/bin/run.sh -b <HOSTNAME> & &> /dev/null 
     SUCCESS=true 
     fi 
     ;; 
    *) 
     echo $M_USAGE 
     exit 1 
    esac 
    shift 
done 

if $SUCCESS ; 
then 
    echo $M_FINISH 
fi 

Phần đặc biệt gây bối rối cho tôi là cái này:

 if [ -e hcm.ear ] 
     then 
     cp -v hcm.ear $DEPLOY_PATH/hcm.ear 
     HCM_DEPLOYED=true 
     else 
     if [ -e hcm.war ] 
     then 
      cp -v hcm.war $DEPLOY_PATH/hcm.war 
      HCM_DEPLOYED=true 
     else 
      echo $M_MISSING_HCM 
     fi 
     fi 

Tôi dường như không thể nhận được elif [ -e hcm.war ] để hoạt động chính xác trên máy chủ từ xa. Các máy chủ từ xa đang chạy bash 3.2.25 trên redhat (nếu điều đó làm cho bất kỳ sự khác biệt.) Tôi nghi ngờ tôi chỉ thiếu một số chi tiết kịch bản shell bash picky.

Mọi đề xuất?

+0

Bạn đang nói rằng bạn không thể có được 'nếu sau đó ... elif sau đó ... fi' để làm việc? –

+0

Vâng, đó là ý tôi. – emptyset

+1

Cân nhắc tạo thói quen chạy mã thông qua http://shellcheck.net/ trước khi đặt câu hỏi tại đây - có một số lỗi mà nó sẽ bắt gặp. –

Trả lời

28

Mã của bạn như được đăng dường như hoạt động.

Có sự khác biệt giữa elif .. fielse ; if ... fi. Số elif ... fi thực sự sẽ có ít hơn fi ở cuối mã của bạn.

Mã của bạn như được đăng, hỏi "nếu hcm.ear tồn tại THEN kiểm tra xem có hcm.war" hay không. Đó là điều bạn muốn? Con đường logic khác để kiểm tra sẽ là "nếu hcm.ear không tồn tại THEN kiểm tra nếu có một hcm.war."

Đó đường Logic thay thế trông giống như

if [ -e hcm.ear ] ; then 
    cp -v hcm.ear $DEPLOY_PATH/hcm.ear 
    HCM_DEPLOYED=true 
    elif [ -e hcm.war ] ; then 
     cp -v hcm.war $DEPLOY_PATH/hcm.war 
     HCM_DEPLOYED=true 
    else 
    echo $M_MISSING_HCM 
    fi 

Tôi hy vọng điều này sẽ giúp.

+0

Vâng, mã khi bạn đăng là giải thích chính xác. Đôi khi, nhóm sẽ muốn triển khai tệp '.ear', nhưng hầu hết thời gian, chúng tôi đang triển khai tệp' .war' cho mục đích thử nghiệm. Tôi không có ';' trong mã của mình, vì vậy tôi sẽ thử nó và xem nó có tạo nên sự khác biệt hay không. – emptyset

+1

Xin lỗi, 'if ...; sau đó' trên một dòng AND 'if ... then' trên 2 dòng thực sự giống nhau. Tôi chỉ muốn thắt chặt mã của tôi để bạn có thể xem thêm trên 1 trang. Cảm ơn bạn đã đánh dấu chk! Chúc may mắn. – shellter

2

Đây không phải là một câu trả lời trực tiếp cho câu hỏi (elif vs khác) nhưng tôi sẽ cấu trúc lại như vậy:

HCM_DEPLOYED=true 
cp -v hcm.ear "${DEPLOY_PATH}/" || cp -v hcm.war "${DEPLOY_PATH}/" || HCM_DEPLOYED=false 
if [ ! ${HCM_DEPLOYED} ]; then 
    echo "${M_MISSING_HCM}" 
else 
    # TODO: detect the hostname 
    ... 

Tức là luôn luôn thử các bản sao kể từ khi bạn luôn luôn muốn làm cho họ, nếu một thất bại cố gắng tiếp theo, vv

Là một sang một bên, bạn luôn luôn muốn quấn đường dẫn và chuỗi trong dấu ngoặc kép. Nếu không, đường dẫn chứa khoảng trống sẽ khiến ứng dụng của bạn bị hỏng.

+0

'[! $ {HCM_DEPLOYED}] 'là một ý tưởng rất tồi tệ. Hãy nhớ rằng '[! ] 'tương đương với' [-n "!" ] '- tức là, nếu không có đối số nào khác,'! 'được xem như là một chuỗi mà chúng ta đang thử nghiệm cho tính trống rỗng/không trống rỗng. Nếu bạn định đề xuất mã thực hành tốt nhất có mục đích, có lẽ nó nên là '[-z" $ HCM_DEPLOYED "]', hoặc '! [-n "$ HCM_DEPLOYED"] '? –

Các vấn đề liên quan