回答:
file.shにはCRLF行終端記号が付いていると思います。
走る
dos2unix file.sh
その後、問題は修正されます。
あなたはこれでubuntuにdos2unixをインストールすることができます:
sudo apt-get install dos2unix
チェックする別のこと(ちょうど私に起こりました):
つまり、この無害に見えるスニペットでも同じエラーが発生します。
die () { test -n "$@" && echo "$@"; exit 1 }
ダムパーサーをハッピーにするには:
die () { test -n "$@" && echo "$@"; exit 1; }
;
Everyステートメントは末尾で終了する;
ことが予想されているので簡単です。例:if [ -f ~/.git-completion.bash ]; then . ~/.git-completion.bash fi
はそのエラーを生成しますが、最後にif [ -f ~/.git-completion.bash ]; then . ~/.git-completion.bash; fi;
は小さなセミコロンに気づきません。つまり、:.bash
とfi
。
zsh
ユーザーから共有されたスクリプトでこれを行いました。前者は動作しますzsh
が動作しませsh
んbash
。私が4人だったらいいので、これで4つの賛成票を出すことができます
クローズされていないif => fi句もこれを発生させます
ヒント:スクリプトが巨大な場合は、トラップを使用してデバッグしてください...
例えば
set -x
trap read debug
unexpected end of file
するとすぐにエラーが発生することに注意してくださいfi
。
StackOverflowの同様の問題から私はこの答えを得ました
Vimでファイルを開いてみてください
:set fileformat=unix
行末をUNIXの末尾に変換し、問題が解決するかどうかを確認します。Vimで編集する場合は、:set fileformat = unixコマンドを入力してファイルを保存します。Notepad ++やAtomなど、他のいくつかのエディターには行末を変換する機能があります。
ありがとう@lemongrassnginger
dos2unix
、受け入れられた回答が助言するように実行する代替方法にすぎません。
だから私はこの投稿を見つけました、そして答えは私を助けませんでした、しかし私はそれがなぜ私にエラーを与えたのか理解することができました。持っていた
cat > temp.txt < EOF
some content
EOF
問題は、上記のコードを関数内にコピーして、誤ってコードをタブ化したことです。最後のEOFがタブ化されていないことを確認する必要があります。
EOF
4つのスペースで字下げしており、bashはそれを解析しませんでした。スペースを削除すると問題が修正されました。
これは、括弧を使用して関数を呼び出そうとしたときに発生していました。
run() {
echo hello
}
run()
でなければなりません:
run() {
echo hello
}
run
私はあなたのコードをファイルにカットアンドペーストすることができ、それは正しく実行されました。このように実行すると、うまくいくはずです。
あなたの「file.sh」:
#!/bin/bash
# june 2011
if [ $# -lt 3 -o $# -gt 3 ]; then
echo "Error... Usage: $0 host database username"
exit 0
fi
コマンド:
$ ./file.sh arg1 arg2 arg3
「file.sh」は実行可能でなければならないことに注意してください。
$ chmod +x file.sh
入力の方法(パイプ、ニンジンなど)のエラーb / cが発生している可能性があります。条件を2つに分割してみることもできます。
if [ $# -lt 3 ] || [ $# -gt 3 ]; then
echo "Error... Usage: $0 host database username"
exit 0
fi
または、をbash
使用しているため、組み込みの構文を使用できます。
if [[ $# -lt 3 || $# -gt 3 ]]; then
echo "Error... Usage: $0 host database username"
exit 0
fi
そして最後に、もちろん、3つの引数が指定されているかどうかを確認することもできます(クリーンで、POSIXシェルの互換性を維持します)。
if [ $# -ne 3 ]; then
echo "Error... Usage: $0 host database username"
exit 0
fi
.shファイルが存在するディレクトリの名前にスペース文字が含まれていないことを確認してください。例:「新しいフォルダ」というフォルダにあるとしたら、引用したエラーに遭遇することになります。代わりに、「New_Folder」という名前を付けます。これがお役に立てば幸いです。
私はパーティーに遅すぎることを知っています。これが誰かを助けることを願っています。
.bashrcファイルを確認します。おそらく名前を変更するか、移動してください。
ここでの議論:単純なbashスクリプトを調達できない
私の場合、\
次のような冗長性があります:
function foo() {
python tools/run_net.py \
--cfg configs/Kinetics/X3D_8x8_R50.yaml \
NUM_GPUS 1 \
TRAIN.BATCH_SIZE 8 \
SOLVER.BASE_LR 0.0125 \
DATA.PATH_TO_DATA_DIR ./afs/kinetics400 \
DATA.PATH_PREFIX ./afs/kinetics400 \ # Error
}
ありませ\
の終わりにDATA.PATH_PREFIX ./afs/kinetics400