4

私はちょうどbashシェルプログラミングを始めました。Windows 7 コンピューターに Cygwin をインストールしました。このチュートリアルを使用してスクリプトを書き始めました。私のスクリプトでは、引数を渡す必要があります。渡さない場合は、エラー メッセージが表示されます。これはチュートリアルからの直接のコードであり、私のコードと同じものです:

[ $# -eq 0 ] && { echo "usage: someArgument";  exit 1; }

私が次のことをするとき:

sh ./myscript.sh

それは私にこのエラーを与えます:

-bash: /home/Me/myscript.sh: line 5: syntax error: unexpected end of file

「予期しないファイルの終わり」は、fiまたはdoneなどをどこかで見逃したことを意味します。

コードを再確認しましたが、何も見つかりませんでした。さらに、この行をコメント アウトすると、スクリプトは問題なく動作します。

を使用してみましたif...then...fi

if [ $# -eq 0 ]
then
    echo "usage: someArgument"
    exit 1;
fi

しかし、役に立たない!

助けてください、それは私を困惑させてきました。

4

3 に答える 3

5

ご迷惑おかけして申し訳ありません。Igor が言及した目に見えないシンボルについて調査しました。あなたはdos2unixそれを解決したCygwinで実行する必要があります。Dos タイプのファイルには、Cygwin を混乱させる\r\n代わり\nのものが含まれています。

これ:

$ dos2unix ./myscript.sh
$ sh ./myscript.sh

正しく動作します。

于 2012-07-15T08:30:35.883 に答える
5

おそらく\r、スクリプトにまたはその他の目に見えないシンボルがあります。スクリプトの先頭に追加set -xしてデバッグをオンにし、スクリプトをもう一度実行してください。

于 2012-07-15T07:58:49.463 に答える
1

別の方法として、パラメーター展開を使用bashして、未設定の変数をテストできます。位置パラメータ$1がない場合、設定が解除されます:

: ${1?"usage: someArgument"}

コマンドは null-op であり、その:引数を展開するためのフックとして機能します$1。が設定されていない場合$1、 に続く単語?が展開されて標準エラーに出力された後、非対話型シェルが終了します。

(これは DOS の行末問題の解決策ではありませんが、変数が設定されていることを強制するための別のアプローチです。)

于 2012-07-15T14:07:02.227 に答える