2011-07-03 5 views
6

ファイルをリストするbashスクリプトを作成中です(この場合はApacheサイトが利用可能です)。ファイルをリストすることは私の最終的な目標として、これらのファイルのそれぞれを配列に取り込み、ユーザーに表示し、処理する "ファイル"をユーザーが選択できるようにすることです。この場合、サイトを有効にします。私は非常に遠くもらっていないlsから配列を作成するBashスクリプト?

、私はアレイと、ループアクションとしてLSを設定する必要があります知っている:

array=$(ls) 
for sites in $array(2) 
do 
echo "$sites" 
done 

私はディレクトリ内のインデックスにファイルの各が必要であることを知っていますユーザーが有効にする番号を入力できるようにします。したがって、次のようになります。

(1) newdomain.com 
(2) newdomain2.com 

Which site would you like to enable (i.e 1)? 

うまくいけばいいと思いますか?

答えて

6

組み込みのselect機能を使用すると、多くの再実装を省くことができます。

select構造は、メニューの生成を容易にします。

select name [in words ...]; do commands; done 

inを次の単語のリストが展開され、項目のリストを生成する:それはforコマンドとほぼ同じ構文を持っています。拡張された単語のセットは、標準エラー出力ストリームに印刷され、それぞれに番号が付いています。 in wordsを省略すると、あたかもin "[email protected]"が指定されているかのように、位置パラメーターが出力されます。 PS3プロンプトが表示され、標準入力から行が読み取られます。行が表示された単語の1つに対応する数字で構成されている場合は、nameの値がその単語に設定されます。行が空の場合、単語とプロンプトが再び表示されます。 EOFが読み取られた場合は、selectコマンドが完了します。その他の値を読み取ると、nameはnullに設定されます。読み取られた行は変数REPLYに保存されます。

+0

ありがとうございます、私はselectコマンドを調べます。 –

6

これはあなたがlsを使用する方法ではありません。

array=(*) 
+0

現在のディレクトリで動作しますが、どこからでもスクリプトを呼び出すことができるので、完全なパス(/ etc/apache2/sites-available /)を定義する必要があります。 –

+0

これは 'ls'のやり方とはどのように違いますか? –

+1

明確化:配列の割り当てを示すためには、括弧が必要です。したがって、少なくとも 'array =($(ls whatever)'と言う必要があります。それ以外の場合は、長い文字列を取得しています。 – geekosaur

-1

あなたが始めるためにいくつかのヒント:

APACHE_CONF=/etc/apache2 
SITES_TO_ENABLE="site1.org | site2.com" 
LIST_AVAILABLE=$(ls $APACHE_CONF/sites-available) 
LIST_ENABLED=$(ls $APACHE_CONF/sites-enabled) 

for site in $(echo $SITES_TO_ENABLE | sed -e "s/|//g") 
do 
    FOUND=$(echo $LIST_AVAILABLE | sed -e "s/ /\n/g" | egrep $site) 
    [[ ! -z $FOUND ]] && echo "Checking availability of $site: Ok" 
    [[ -z $FOUND ]] && echo "Checking availability of $site: Nok, site \"$site\" required for production has not been found or is not defined" && exit 1 
done 

あなたはと、このアプローチを組み合わせることができますが、もちろんを選択します。

+0

これは、ディレクトリの1つのファイルに、名前にワイルドカード文字、または印刷できない、または 'IFS'内に見つかったものが含まれるまでのみ動作します。 http://mywiki.wooledgeも参照してください。org/ParsingLs –

関連する問題