2012-06-25 46 views
0

我正在編寫腳本,以便使用本地計算機中的開發網站執行一系列操作。這個想法是在「/ var/www /」中列出所有文件夾(網站),並讓用戶選擇一個來執行後續操作。我發現這個腳本的一些靈感here查找目錄中的文件夾,然後將它們列爲bash腳本中的選項

我剛開始學的bash,所以不要指望褻瀆代碼:

這是我堅持:

#!/bin/bash 

cd /var/www 
options=($(find . -maxdepth 1 -type d -printf '%P\n')) 
options[$[${#options[@]}+1]]="type a new site" 

title="Website developing script" 
prompt="Choose the site:" 

echo "$title" 
PS3="$prompt " 
select opt in "${options[@]}" "Quit"; do 

    case "$REPLY" in 
     # so far so good, all folders are properly listed as options    

     # the answer, I guess, is placing a loop here in order to change this 
     # example line into a list of options, but I can't figure out how 
     1) echo "You picked $opt which is option $REPLY";;  

    $((${#options[@]}+1))) echo "Exiting"; break;; 
    *) echo "Invalid option. Try another one.";continue;; 

    esac 

done 

任何提示是最歡迎的。提前致謝。

+0

不推薦使用'$ []'作爲算術。改用'(())'。然而,一個數組下標已經是一個算術上下文,所以:'options [$ {#options [@]} + 1] =「鍵入一個新的站點」,**但是**你可以追加到一個數組而不需要增加一個索引,所以:'options + =(「鍵入一個新的站點」)' –

回答

0

定義處理每個案例的函數。而不是在開關情況下的那些回聲語句,用所有必需的參數調用適當的函數。

0

我會建議處理「退出」和「鍵入新網站」的案例,以及執行任何選定目錄上的所有操作的一般情況。

以下略顯hackish。

未經測試。

#!/bin/bash 

cd /var/www 
options=($(find . -maxdepth 1 -type d -printf '%P\n')) 
lastdirindex=${#options[@]} 

saveIFS=$IFS 
IFS='|' 
pattern="^(${options[*]})$" # create a regex that looks like: ^(dir1|dir2|dir3)$ 
IFS=$saveIFS 

options+=("type a new site") 
newindex=${#options[@]} 
options+=("Quit") 
quitindex=${#options[@]} 

processchoice() { echo "Do stuff with choice $1 here"; } 

title="Website developing script" 
prompt="Choose the site:" 

echo "$title" 
PS3="$prompt " 

select opt in "${options[@]}"; do 
    case $([[ $REPLY =~ $pattern ]] && echo 1 || echo "$REPLY") in 
     1   ) echo "You picked $opt which is option $REPLY"; processchoice "$REPLY";; 
     $newindex ) read -r -p "Enter a new site" newsite; processchoice "$newsite";; 
     $quitindex) echo "Exiting"; break;; 
     *   ) echo "Invalid option. Try another one."; continue;; 
    esac 
done 
相關問題