2012-07-07 5 views
9

私は基本的に5つのコマンドを連続して実行するbashスクリプトを持っています。私はあなたに「コマンドAを実行しますか?」と尋ねるロジックを追加したいと思います。もし私がYESと答えたら、コマンドが実行されます。そうでなければ、スクリプトは別の行にジャンプし、 "コマンドBを実行しますか? 。ユーザーのyes/no入力に反応する単純なif/else bashスクリプト?

スクリプトは非常に単純であり、この

echo "Running A" 
commandA & 
sleep 2s; 
echo "done!" 

echo "Running B" 
commandB & 
sleep 2s; 
echo "done!" 
... 
+2

なぜあなたは '&'を使用していて、そこに眠っていますか?あなたはそれを同期して実行する必要があります... – cha0site

+0

@ cha0site私はいくつかの外部開発ツールを起動していますが、ツールは最初のコマンドだけを起動します。 – sandalone

答えて

16

は、ユーザからの入力を取得するread組み込みを使用してのように見えます。

read -p "Run command $foo? [yn]" answer 
if [[ $answer = y ]] ; then 
    # run the command 
fi 

あなたはそれを複数回やろうとしている場合は、引数としてコマンドを受け取り(そしておそらくプロンプト)functionに上記置きます。

+0

私は二重[括弧では動作しません。 – sandalone

+1

これは本当に '[['。 'bash'を'#! 'と使用していますか?/bin/bash'をスクリプトの最初の行として使用しますか? – Mat

+0

'#!/bin/bash'を1行目に追加します。私は明示的にbashだと言っていないので、それが問題になるかもしれないと思います。 – sandalone

1

あなたがBashを望むread builtin。 、すべてのコマンドによって

for cmd in "echo A" "echo B"; do 
    read -p "Run command $cmd? " 
    if [[ ${REPLY,,} =~ ^y ]]; then 
     eval "$cmd" 
     echo "Done!" 
    fi 
done 

これがループをそれぞれに対してユーザを促し、その後、唯一の最初の文字場合、コマンドを実行します。あなたはそうのような暗黙のREPLY変数を使用して、ループ内でこれを行うことができますユーザーの応答はYまたはY文字です。希望が助けてくれる!

+0

できれば' eval'を避けてみてください。 1つの考え方は、各コマンドを、自分自身を記述する関数か、呼び出す方法に応じて実行する関数にカプセル化することです。 – tripleee

+0

小文字のパラメータ拡張 '$ {,,}'にはBash 4が必要です。[BashFAQ/050](http://mywiki.wooledge.org/BashFAQ/050)を参照してください。 –

関連する問題