0
if [ $#!=2 ]
then
    echo "Please enter two text files"
fi 

これは私に与えます:

swap.sh: line 12: syntax error near unexpected token `fi'
'wap.sh: line 12: `fi 
4

1 に答える 1

1

ここには、少なくとも 2 つの明確な問題があります。

まず、その比較の正しい構文では、!=演算子の前後にスペースが必要です。

if [ $# != 2 ]
then
    echo "Please enter two text files"
fi 

しかし、これらのスペースがなければ、構文エラーではなく、単に正しくありません。 -- の$#!=2ような 1 つの単語に単純に展開する必要があります。また、 orコマンドに 1 つの単語を指定すると、その単語が空かどうかをテストするだけです。したがって、投稿したコードは、2 つの引数を指定した場合でも、常に出力する必要があります。スペースを追加すると、その問題が解決するはずです。2!=2[test"Please enter two text files"

エラーメッセージのフォーマット方法(そして、正しく表示されるように質問を編集する必要がありました。インラインコードのバッククォートはMarkdownでは扱いにくいです)、スクリプトにはWindowsスタイルの行末があるようです. のようなプログラムがある場合は、dos2unixそれを使用してスクリプトを Unix スタイルの行末に変換できます。ただし、man ページを注意深く読んでください。ほとんどの Unix スタイルのテキスト フィルターとは異なりdos2unix、入力ファイルを変更します。

Windows スタイルの行末は、キャリッジ リターンとそれに続くライン フィード、または\r\n. シェル (bash?)\nは を行末文字として認識しますが、は単なる別の文字であるため、トークンとして\rではなく、 を認識します。そして、エラー メッセージにそのトークンを出力すると、カーソルが現在の行の先頭に移動し、ファイル名が上書きされます。実際のエラー メッセージは次のようになります。fiif\r\r

swap.sh: line 12: syntax error near unexpected token `fi'
'wap.sh: line 12: `fi 

しかし、それは本当にこれです:

swap.sh: line 12: syntax error near unexpected token `fi'
swap.sh: line 12: `fi\r'

(Cygwin を使用していますか? この種の問題が最も一般的に現れるのは Cygwin です。)

于 2013-09-08T00:48:20.723 に答える