2017-07-27 6 views
2

現在、シェルスクリプトを研究していて、構文上の問題があります。Bash:regexを含む複数の条件を使用するシェルスクリプトif文

if [ $usrGuess =~ *[:alpha:]* && $usrGuess != "giveup" ] 

:私はtyring午前何

は「ギブアップ」ラインここ

除き、アルファベットで任意のユーザ入力をキャッチする「もし」ステートメントは、私が構築されたコードであることを確認することです私は、コードを実行したら、それはそれを言って、エラーメッセージを与える:

[: missing `]' 

あなたたちはこのへの解決策を持っている場合、私はあなたのアドバイスを聞いて幸せになります:)

ありがとうございます!

答えて

2

test[)任意のシェル(または外部1)の組み込みなど、条件付き構造物を入れてサポートしていません。 &&,||または複数のコマンドセパレータ。内部に;

また、[は、=~との正規表現のマッチングをサポートしていません。ところで、あなたのRegexパターンは正しくありません。それはglobパターンのようです(この場合は十分です)。

上記のいずれも、[[キーワードがbashであり、すべてのシェルがこれらをサポートしているわけではありません。

だから、あなたが行うことができます:

if [[ $usrGuess = *[[:alpha:]]* && $usrGuess != "giveup" ]] 

をここで、私は[[のために移動し、グロブマッチ$usrGuess = *[:alpha:]*を使用していた(正規表現マッチングを落としました)。

+0

貴重なご回答ありがとうございます。私はこの分野にはまったく新しいもので、あなたは私が何を不思議に思っていたかについて大きな説明をしました。再び、ありがとう! –

+0

@HojinLee喜んで私は助けることができました:) – heemayl

0

使用二重括弧、あなたの状態は、複合材料であるとして:

if [[ $usrGuess =~ *[:alpha:]* && $usrGuess != "giveup" ]] 
+0

よろしくお願いします。それは非常に恥ずかしいですが、私はまだそれが動作する方法を取得しません。私が見つけたのは、二重括弧で処理が高速化されていることですが、構文上の違いは何か分かりません。これについて私に説明してもらえますか? –

+0

'* [:alpha:] *'は有効な正規表現ではありません。 – chepner

0

grepコマンドを使用するやや異なるアプローチも有効です。

if grep -v '^giveup$' <<<$userGuess | grep -iq '^[a-z]*$' 

この例では、grepコマンドの終了コードを使用してif-elseを決定します。また、2番目のgrepコマンドの '-q'オプションにも注意してください。これにより、grepコマンドがパターンにマッチするようになります。

長所:less(if)節がより複雑です。

欠点:2つのプロセスが実行されています(grep)。

+0

ありがとう、私はこのアプローチについて考えたことはありません。文字通り、私は昨日このシェルスクリプトを見始めて、それはJavaの近くのどこにも感じません。 :P –

0

POSIXとの互換性を維持したい場合は、exprコマンドを使用して正規表現の一致を実行します。

いずれにせよ、私は最初に「諦め」をチェックすることを選択します。そのチェックが失敗した場合は、より高価な正規表現チェックを完全に回避します。

関連する問題