1

私はシェルスクリプトを書いています、そして私はやっています

if ["$item0" == "$item1"]
then
echo match
fi

ただし、実行すると、その行に「そのようなファイルまたはディレクトリはありません」というエラーメッセージが表示されます。上記の項目には、役立つ場合はファイルパスが含まれています。

4

3 に答える 3

6

変数と角かっこの間のスペースに注意する必要があります。それらは重要です。また、thenがと同じ行にある場合はif;

修正された構文:

if [ "$item0" == "$item1" ]; then
    echo match
fi

PSmatchが変数であると想定されている場合は、それが変数であることを確認してくださいecho "$match"

于 2012-10-30T16:57:39.103 に答える
3

まず、ここに投稿するときは、おそらく常に完全なエラーメッセージを表示し、機密データを削除する必要があります。

まず、あなたのラインがどのように間違っているかを説明することから始めましょう:

  1. bashでは、[は基本的にの同義語ですtestが、いくつかの小さな違いがあります(最も顕著なのは、最後の引数がであると想定していることです])。詳細については、実行man testしてください。test独自の構文を持つものを取り込み、入力がtrueまたはfalseのどちらに評価されたかに応じて適切な値を返します。したがって、testはプログラムであり、bashビルトインではないため、入力を個別のパラメーターとして受け取る必要があります(スペースに注意してください)。

    [ "$item0" = "$item1" ]

    =代わりに==文体の好みです。それらは同じことをしますが=、bashはCではないので一部の人々に好まれます。

  2. 次に、bashは、外部コマンドへの入力がいつ終了するかを知る必要があります。これはで行われ;ます。これを明確にするために、私がこれを行うと仮定します

    if true then echo foo fi fi

    foo fiここで、ifステートメントがtrueと評価された場合に出力しようとしています。私の問題がわかりますか?Bashは、echoコマンドへの入力をいつ終了するかを知りません。

適切に書き直されました:

if [ "$item0" = "$item1" ]; then echo match; fi
于 2012-10-30T17:11:32.170 に答える
1

価値があるの[[は、bashを使用している場合、それよりもはるかに使いやすく、信頼性が高いことです[(本当に移植性が必要な場合を除い[[て、しばらくの間、bashのイディオムとして好まれてきました)。一つには、パラメータ展開をで引用する必要[[はなく、空の文字列についても心配する必要はありません。また、パターンマッチング(with ==)と正規表現マッチング(with)の両方を備えています=~

于 2012-10-30T19:31:53.173 に答える