if ステートメントの条件としてコマンドを使用しながら bash スクリプトを記述するにはどうすればよいですか?

if ステートメントの条件としてコマンドを使用しながら bash スクリプトを記述するにはどうすればよいですか?

HTML フォームからの入力を処理する bash スクリプトを書いています。

最初の問題は、コマンドを条件として使用しながら if ステートメントを機能させることができないことです。ミドルネームのイニシャルのユーザー入力をチェックし、それを調整して $answer に組み合わせることができるようにしようとしています。

以下は、どのように処理されるかの例です。

ユーザーは、HTML フォームから、名、ミドルネームのイニシャル、姓の 3 つの異なるフィールドを入力します。

名: George
ミドルネームのイニシャル: W.
姓: Bush

シェル スクリプトは、ユーザー入力と実際の回答を処理して比較します。実際の回答は「George W. Bush」です。

ユーザー入力:
George W. Bush = 正解、エコー「正解です!」
George W Bush = 正解、自動的に「W」の後にピリオドが付けられます
George Bush != 間違い、エコー「ミドルネームのイニシャルがありません!」
Geor W. Bus != 間違い、エコー「名と姓が間違っています!」

#! /bin/bash
echo Content-type: "text/html"
echo ""

read input #name variable $first, $middle, $last name

first=`user input`
middle=`user input`
last=`user input`

president=`actual answer, full name of president`
answer=`user answer, combination of $first, $middle, $last`

correctF=`actual first name from $president`
correctM=`actual middle initial from $president`
correctL=`actual last name from $president`
#cut by column from $president

最初の問題はここから始まります。

if [[ $(echo $middle | wc -l) = 1 ]] ; then
    middle=`echo "$middle""."` 
    #check if middle initial variable was entered with just the letter and place a period after
elif [[ $(echo $middle | grep '.') = 'true' ]] ; then
    middle=`echo "$middle"`
    #check if middle initial variable was entered with the period and leave it as is
else
    middle=`'false'`
    #no middle initial variable was entered and is null
fi

if ステートメントを使用した while ループの 2 番目の問題。

ユーザー入力 $answer と実際の回答 $president を比較し、$answer の何が間違っているかをエコーし​​ようとしています。このセクションでは何もエコーされません。

while [ "$president" -ne "$answer" ] #not working
    do
            if [ "$first" -ne "$correctF" ]
                    then
                            echo "Wrong first name!"
            elif [ "$middle" -ne "$correctM" ]
                    then
                            echo "Wrong middle initial!"
            elif [ "$last" -ne "$correctL" ]
                    then
                            echo "Wrong last name!"
            elif [ -z "$middle" -ne "$correctM" ]
                    then
                            echo "No middle initial!"
            elif [ "$first" -ne "$correctF" ] && [ "$last" -ne "$correctL" ]
                    then
                            echo "Wrong first and last name!"
            elif [ "$first" -ne "$correctF" ] && [ "$middle" -ne "$correctM" ]
                    then
                            echo "Wrong first name and middle initial!"
            elif [ "$middle" -ne "$correctM" ] && [ "$last" -ne "$correctL" ]
                    then
                            echo "Wrong middle initial and last name!"
            elif [ "$first" -ne "$correctF" ] && [ "$middle" -ne "$correctM"] && [ "$last" -ne "$correctL" ]
                    then
                            echo "You got it all wrong!"
                    else
                            echo "You are correct!"
            fi

if ステートメントの条件にコマンドを適切に実装し、複数の条件を持つ if ステートメントを記述する必要があります。

答え1

cas は、「このスクリプトには多くの間違いがあり、どこから始めればいいのかさえわかりません...」と言います。さて、どこから始めればいいのか、私にはいくつかアイデアがあります。

  • スクリプトのデバッグを依頼してから疑似コードを投稿しないでください。最初のコード ブロックには、機能しない場所にバッククォート (`) が含まれています。
  • もっと明確にしてください。「if ステートメントが機能しない」というのは、私たちにとってあまり役に立ちません。何が起こるのでしょうか?
  • "$middle"正当な理由があり、自分が何をしているのかわかっている場合を除き、シェル変数参照 (例: ) は常に引用符で囲む必要があります。
  • $(echo "$middle" | grep '.')は と等しい'true' 場合にのみ等しくなります。 の出力 は"$middle"truegrepコンテンツパラメータとして指定されたパターンに一致する入力からの行。
  • .は「任意の文字」を意味するパターンなので、grep '.'空白以外の入力行に一致します。実際のピリオド(.) の場合は を使用します。これはだけでなく、、などにもgrep '\.'一致することに注意してください。W..W...3.14159
  • なぜ を実行するのですかwhile? そのコードは複数回実行されると予想されますか? 同じデータに対して繰り返し実行した場合に異なる結果が得られると予想されますか? ループの終わりはどこですか?
  • -eqそして-ne整数を比較する場合にのみ使用してください。=そして!=文字列用。
  • どういう意味?-z STRING1 -ne STRING2

他にも問題があるのか​​もしれませんが、目が痛すぎてこれ以上見続けることができません。

関連情報