2016-12-12 9 views
1

アスタリスクを含む文字列を基本的に探して、untilループに関連する文字列を探しますが、役に立たないのです!文字列にリテラルアスタリスクが含まれているかどうかをテストします。

ユーザーは基本的に文字列を入力し続け、アスタリスクを持つものがポップアップするまでプログラムはそれらを拒否します。

、この時点で、それはメッセージをエコーし​​ます[気の毒詳細に入るカント]

コード:

until [ "string" == "[asteriskstuff]" ] 
do 

    echo "just give me a string with an asterisk for crying out loud" 

    read "string" 

done 

ユーザーがHI入力停止して入力することを決定HI *それは、その後表示されますエコーメッセージ 基本的には私はちょうどbleedin 'アスタリスクを迂回したいと思っています。なぜなら、[asteriskstuff]は私がいつも震えているところですから!

すべてのお役に立ちました!

概要:アスタリスクを簡単な方法で回避してuntilループを回避するにはどうすればよいですか?

+0

アスタリスクの出所を知る必要がありますか?変数ですか?リテラル部分はありますか? –

+1

'[]'は[POSIX指定の 'test'コマンドの代替名](http://pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html)サポートする標準によって保証されている唯一の文字列比較演算子は' = 'ではなく、' == 'ではなく(そして、定義された部分文字列の一致操作はまったくありません)。 Bashは '=='を拡張子としてサポートしていますが、拡張子が必要な場合は、 '[[]]'を使うべきです。これはグロブ、正規表現、ロットをサポートする*明示的*拡張形式です他の良さ。 –

+1

ところで、それは決してあなたがこのメッセージの大部分によって何を意味するかを決して明らかにしていません。 「アスタリスクをバイパスする」という言葉で「バイパス」とはどういう意味ですか? **あなたがそこにアスタリスクを入れずに同じ比較をしたいですか?その状態でループを終了しますか?他に何か? –

答えて

4

chepner's helpful answerは、元のアプローチの問題点をよく説明しています。

次のプロンプトリテラル*は、ユーザ入力のどこにでも見出されるまで:

until [[ $string == *'*'* ]]; do 
    echo "just give me a string with an asterisk for crying out loud" 
    read -r string 
done 
  • [[ ... ]]なく[ ... ]==のRHS(上に一致パターンを可能にするために使用されなければなりません=)。

    • あなただけ[ ... ]がサポートされています(/bin/sh用)POSIX準拠のスクリプトを、書いている場合を除き、それはより多くの機能と少数の驚きを提供していますので、日常[[ ... ]]の使用を検討:鉱山のthis answerを参照してください。
  • *'*'*氏は述べていますpatternです: - シングル引用し一部 - リテラル*に一致する任意の場所に文字列に。 引用符なし*インスタンスは任意の文字列を表します。

    • これらのパターンはない正規表現をグロブしているファイル名で使用されるものと同じです。
    • しかし、Bashは[[ ... =~ ... ]]によって正規表現マッチングも提供しています。したがって、条件はまた、[[ $string =~ '*' ]]又は[[ $string =~ \* ]]
  • -rのように書くことができる\文字の予期しない処理を防止するために、習慣の問題としてreadと共に使用されるべきです。

+0

二重括弧を使用しなければならないという事実を説明してくれてありがとう、私は常に一括弧を使いました。それが主要な問題の1つでした。 –

+0

@StudentofArt私の喜び。 Bashスクリプトでは、POSIXに準拠している必要がない場合、 '[[...]]'を使うのが普通です - 私は '[[...]]と対照的に、と '[...]'。 – mklement0

3

@mklement's answerは実際には解決策を提供する。私は主にその問題について説明しています。


あなたは値パラメータstring比較されていません。リテラル文字列stringを比較しています。これは、あなたがそうでなければ、適切なものを引用している(グロブとは何の関係もありません。

until [ "$string" = "[asteriskstuff]" ]; do 
    read string 
done 

あなたはどのことができ、それが有効な識別子である必要がリテラル文字列であることから、readの引数を引用符で囲む必要はありません_と文字と数字のみで構成されていますが、引用符で囲むことで傷つくことはありません。

関連する問題