0

ローカル マシンにある開発サイトで一連の操作を実行するために、スクリプトを作成しています。これは、"/var/www/" 内のすべてのフォルダー (Web サイト) を一覧表示し、ユーザーが 1 つを選択して後続の操作を実行できるようにするというものです。このスクリプトのインスピレーションをここで見つけました。

私は 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

どんなヒントでも大歓迎です。前もって感謝します。

4

2 に答える 2

0

「終了」と「新しいサイトの入力」を処理するケースと、選択したディレクトリですべてのアクションを実行する一般的なケースをお勧めします。

以下は少しハックです。

未テスト。

#!/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
于 2012-06-26T04:09:41.473 に答える
0

それぞれのケースを処理する関数を定義します。switch ケースの echo ステートメントの代わりに、必要なすべての引数を指定して適切な関数を呼び出します。

于 2012-06-25T21:28:06.710 に答える