web-dev-qa-db-ja.com

ユーザー入力をbashする

私は単純なことをするのに苦労しています

Do you want to do that? [Y,n] _

バッシュで質問。

私は試した

echo "Do that? [Y,n]"
read DO_THAT
if ["DO_THAT"="y"]; then
  do_that
fi

しかし失敗します:bash: [y=y]: command not found

私は何を間違っているのですか?

23
frnhr

明示的なプロンプト:-pと、1文字入力-n1を指定すると、ENTERなしでyを挿入できます。

read -n1 -p "Do that? [y,n]" doit 
case $doit in  
  y|Y) echo yes ;; 
  n|N) echo no ;; 
  *) echo dont know ;; 
esac
50
user unknown
echo "Do that? [Y,n]"
read input
if [[ $input == "Y" || $input == "y" ]]; then
        echo "do that"
else
        echo "don't do that"
fi

If条件の構文と間隔に細心の注意を払うと、常にbashで取得できます:)

11
Kenny Cason

Bashでreadのオプションを探します-プロンプトなどを実行できます。

read -p "Do that? [Y,n]" -i Y input

残りについては、コマンド名の前後にスペースを入れてください( '['はコマンドです-/bin/[ですが、これもシェル組み込み)引数です。


Bashマニュアル、第4章:シェル組み込みコマンド

読んだ

  read [-ers] [-a aname] [-d delim] [-i text] [-n nchars] [-N nchars]  
       [-p Prompt] [-t timeout] [-u fd] [name ...]

標準入力から、または「-u」オプションの引数として指定されたファイル記述子fdから1行が読み取られ、最初のWordが最初の名前に、2番目のWordが2番目の名前にというように割り当てられます。残りの単語とその間にある区切り文字が姓に割り当てられています。入力ストリームから読み取られる単語の数が名前よりも少ない場合、残りの名前には空の値が割り当てられます。 IFS変数の値の文字は、行を単語に分割するために使用されます。バックスラッシュ文字「\」を使用して、次の文字の読み取りおよび行継続のための特別な意味を取り除くことができます。名前が指定されていない場合、読み取られた行が変数REPLYに割り当てられます。ファイルの終わりに達しないか、読み取りがタイムアウトするか(この場合、戻りコードが128より大きい場合)、または無効なファイル記述子が「-u」の引数として指定されていない限り、戻りコードはゼロです。

オプションが提供されている場合、その意味は次のとおりです。

-a aname単語は、配列変数anameの0から始まる連続したインデックスに割り当てられます。すべての要素は、割り当て前にanameから削除されます。他の名前引数は無視されます。

-d delim delimの最初の文字は、改行ではなく入力行の終了に使用されます。 -e Readline(第8章[コマンドラインの編集]、93ページを参照)を使用して、行を取得します。 Readlineは、現在(または、行編集が以前にアクティブでなかった場合はデフォルト)の編集設定を使用します。 -i text行の読み取りにReadlineが使用されている場合、テキストは編集を開始する前に編集バッファーに配置されます。

-n nchars readは、入力の完全な行を待つのではなく、nchars文字を読み取った後に戻りますが、区切り文字の前に読み取られる文字がncharsより少ない場合は、区切り文字を受け入れます。

-N nchars readは、EOFが検出されるか、読み取りがタイムアウトになるまで、入力の完全な行を待つのではなく、正確にnchars文字を読み取った後に戻ります。入力で検出された区切り文字は特別に扱われず、 nchars文字が読み取られるまで、readは戻りません。

-pプロンプト入力を読み取ろうとする前に、末尾の改行なしでプロンプトを表示します。プロンプトは、入力が端末からのものである場合にのみ表示されます。

-rこのオプションを指定すると、バックスラッシュはエスケープ文字として機能しません。バックスラッシュは行の一部と見なされます。特に、バックスラッシュと改行のペアは行継続として使用できません。

-sサイレントモード。入力が端末からのものである場合、文字はエコーされません。

-t timeoutタイムアウト秒以内に入力の完全な行が読み取られない場合、読み取りをタイムアウトさせて失敗を返します。タイムアウトは、小数点に続く小数部分のある10進数です。このオプションは、readが端末、パイプ、またはその他の特殊ファイルから入力を読み取る場合にのみ有効です。通常のファイルから読み取る場合は効果がありません。タイムアウトが0の場合、読み取りは、指定されたファイル記述子で入力が利用可能な場合は成功を返し、そうでない場合は失敗を返します。タイムアウトを超えると、終了ステータスは128より大きくなります。

-u fdファイル記述子fdから入力を読み取ります。

6

「if」と変数の間に空白スペースを入れる必要があります。

if [ $var == "y" ]; then echo "ese era el problema" fi

ケース変更演算子を使用できます。

if [ "${DECISION^^}" = "Y" ]; then
...
fi

詳細については、bashマニュアルの「パラメータ拡張」を参照してください。

1
niziak