Kesalahan sintaksis Bash: akhir file tidak terduga

99

Maafkan saya karena ini adalah skrip yang sangat sederhana di Bash. Berikut kodenya:

#!/bin/bash
# june 2011

if [ $# -lt 3 -o $# -gt 3 ]; then
   echo "Error... Usage: $0 host database username"
   exit 0
fi

setelah menjalankan sh file.sh:

kesalahan sintaks: akhir file yang tidak terduga

markcruz.dll
sumber

Jawaban:

137

Saya pikir file.sh dengan terminator baris CRLF.

Lari

dos2unix file.sh

maka masalahnya akan diperbaiki.

Anda dapat menginstal dos2unix di ubuntu dengan ini:

sudo apt-get install dos2unix
clyfish
sumber
Apa alasan dibalik masalah ini? Saya biasanya bekerja di Windows tetapi perlu mentransfer skrip ke sistem unix.
CMCDragonkai
Baris baru di windows adalah "\ r \ n", sedangkan di linux adalah "\ n".
clyfish
8
@KeesdeKooter Saya tidak akan mengatakan hanya karena ada sesuatu yang tidak berhasil untuk Anda sehingga Anda harus menurunkannya, jelas itu berhasil untuk 28 suara positif. Sederhana saja tidak cukup bagi saya. Itulah mengapa SO mengizinkan banyak jawaban untuk sebuah pertanyaan karena mungkin ada banyak solusi untuk suatu masalah.
Jeff Wilbert
2
Menggunakan editor notepad ++ Edit> Konversi EOL> Format Mac Lama memecahkannya untuk saya.
raktale
Jika Anda dapat mengedit file bash Anda dengan Notepad ++. Pergi ke Edit-> Konversi EOL-> Macintosh (CR). Ubah ke Macintosh (CR) meskipun Anda menggunakan OS Windows.
Juniar
127

Hal lain untuk diperiksa (baru saja terjadi pada saya):

  • hentikan badan fungsi baris tunggal dengan titik koma

Yaitu cuplikan yang tampak tidak bersalah ini akan menyebabkan kesalahan yang sama:

die () { test -n "$@" && echo "$@"; exit 1 }

Untuk membuat pengurai bodoh senang:

die () { test -n "$@" && echo "$@"; exit 1; }
ulidtko
sumber
3
+1 Juga berlaku untuk cuplikan kode dengan tanda kurung seperti ini: [["$ #" == 1]] && [["$ arg" == [1,2,3,4]]] && printf "% s \ n "" blah "|| {printf "% s \ n" "blahblah"; pemakaian; } ............ Perhatikan bahwa titik koma di dalam tanda kurung siku, tepat setelah memanggil beberapa fungsi yang telah didefinisikan sebelumnya 'penggunaan'. Melupakan itu akan memberi Anda kesalahan sintaks yang sama: eof yang tidak terduga.
Cbhihe
kamu berhasil. Sebenarnya hal yang sederhana adalah ;pernyataan Every diharapkan diakhiri dengan ;begitu letakkan di bagian akhir misalnya: if [ -f ~/.git-completion.bash ]; then . ~/.git-completion.bash fiakan menghasilkan kesalahan itu, sedangkan if [ -f ~/.git-completion.bash ]; then . ~/.git-completion.bash; fi;tidak akan ... perhatikan titik koma kecil di akhir, yaitu: setelah .bashdan fi.
Emmanuel Mahuni
1
Saya memiliki ini di skrip yang dibagikan dengan saya dari zshpengguna. Yang pertama bekerja di zshtetapi tidak di shnor bash. Seandainya saya adalah 4 orang sehingga saya bisa memberikan 4 suara positif ini
Davos
42

saya juga baru saja mendapat pesan kesalahan ini dengan menggunakan sintaks yang salah dalam sebuah ifklausa

  • else if (kesalahan sintaks: akhir file tidak terduga)
  • elif (sintaks yang benar)

saya men-debugnya dengan mengomentari bit sampai berhasil

marengaz
sumber
Terima kasih banyak .. seseorang tolong beri orang ini medali
Happiehappie
17

klausa if => fi yang tidak ditutup akan meningkatkannya juga

tip: gunakan trap untuk men-debug, jika skrip Anda sangat besar ...

misalnya

set -x
trap read debug
theRiley
sumber
1
Saya benar-benar lupa "fi"! Terima kasih :) Jika bisa, untuk kepentingan semua orang, jelaskan sedikit tentang tip Anda dalam menggunakan trap.
Carles Alcolea
3
maaf atas keterlambatannya, teman saya. Perintah 'the' trap 'adalah cara untuk men-debug skrip Anda dengan secara esensial memutus setiap baris. diskusi yang lebih lengkap ada di sini: stackoverflow.com/questions/9080431/…
theRiley
1
Itu bermanfaat, terima kasih banyak. Perhatikan bahwa unexpected end of filekesalahan akan terjadi segera setelah fidipukul.
Stephane B.
8

Saya mendapat jawaban ini dari masalah serupa di StackOverflow

Buka file di Vim dan coba

:set fileformat=unix

Ubah akhir baris eh menjadi akhiran unix dan lihat apakah itu menyelesaikan masalah. Jika mengedit di Vim, masukkan perintah: set fileformat = unix dan simpan file. Beberapa editor lain memiliki kemampuan untuk mengonversi akhiran baris, seperti Notepad ++ atau Atom

Terima kasih @lemongrassnginger

Jay Killeen
sumber
Ini hanyalah cara alternatif untuk dilakukan dos2unixseperti yang disarankan oleh jawaban yang diterima.
ulidtko
7

di cygwin saya membutuhkan: -

 export SHELLOPTS
 set -o igncr

di .bash_profile. Dengan cara ini saya tidak perlu menjalankan unix2dos

zzapper
sumber
6

Jadi saya menemukan posting ini dan jawabannya tidak membantu saya tetapi saya dapat mencari tahu mengapa itu memberi saya kesalahan. Saya punya

cat > temp.txt < EOF
some content
EOF

Masalahnya adalah bahwa saya menyalin kode di atas untuk menjadi suatu fungsi dan secara tidak sengaja men-tab kode tersebut. Perlu memastikan EOF terakhir tidak di tab.

Rafael Urena
sumber
1
Ini persis kasus saya. Saya telah EOFmenjorokkan empat spasi dan bash tidak menguraikannya karena itu. Menghapus spasi memperbaiki masalah.
aexl
5

Saya mengalami masalah saat menulis pernyataan "if - fi" dalam satu baris:

if [ -f ~/.git-completion.bash ]; then . ~/.git-completion.bash fi

Menulis multiline memecahkan masalah saya:

if [ -f ~/.git-completion.bash ]; then 
    . ~/.git-completion.bash
 fi
Sergey
sumber
3

Ini terjadi pada saya ketika saya mencoba memanggil fungsi menggunakan tanda kurung, mis

run() {
  echo hello
}

run()

seharusnya:

run() {
  echo hello
}

run
Christian Scott
sumber
2

UNTUK WINDOWS:

Dalam kasus saya, saya bekerja pada OS Windows dan saya mendapatkan kesalahan yang sama saat menjalankan autoconf.

  • Saya cukup membuka file configure.ac dengan NOTEPAD ++ IDE saya.
  • Kemudian saya mengonversi File dengan konversi EOL menjadi Windows (CR LF) sebagai berikut:

    EDIT -> KONVERSI EOL -> WINDOWS (CR LF)

Juniar
sumber
1

Saya dapat memotong dan menempelkan kode Anda ke dalam file dan berjalan dengan benar. Jika Anda menjalankannya seperti ini, seharusnya berfungsi:

"File.sh" Anda:

#!/bin/bash
# june 2011

if [ $# -lt 3 -o $# -gt 3 ]; then
   echo "Error... Usage: $0 host database username"
   exit 0
fi

Perintah:

$ ./file.sh arg1 arg2 arg3

Perhatikan bahwa "file.sh" harus dapat dijalankan:

$ chmod +x file.sh

Anda mungkin mendapatkan kesalahan itu b / c dari cara Anda melakukan input (w / a pipa, wortel, dll.). Anda juga dapat mencoba membagi kondisinya menjadi dua:

if [ $# -lt 3 ] || [ $# -gt 3 ]; then
   echo "Error... Usage: $0 host database username"
   exit 0
fi

Atau, karena Anda menggunakan bash, Anda dapat menggunakan sintaks bawaan:

if [[ $# -lt 3 || $# -gt 3 ]]; then
   echo "Error... Usage: $0 host database username"
   exit 0
fi

Dan, terakhir, Anda tentu saja dapat memeriksa apakah 3 argumen diberikan (bersih, pertahankan kompatibilitas shell POSIX):

if [ $# -ne 3 ]; then
   echo "Error... Usage: $0 host database username"
   exit 0
fi
aaronstacy
sumber
saya masih mendapat kesalahan yang sama. saya tidak yakin di mana kode salah
markcruz
aneh, saya memotong dan menempelkan kode Anda dan berfungsi seperti yang diharapkan. apakah ada keluaran kesalahan lagi? banyak waktu bash akan mencantumkan nomor baris. juga, sistem apa yang Anda jalankan? (Linux, MacOS, BSD, distro, dll)
aaronstacy
1

Hilangnya kurung kurawal pada definisi fungsi akan menyebabkan kesalahan ini seperti yang baru saya temukan.

function whoIsAnIidiot() {
    echo "you are for forgetting the closing brace just below this line !"

Yang tentunya harus seperti ini ...

function whoIsAnIidiot() {
    echo "not you for sure"
}
Mike
sumber
0

Saya baru saja memotong dan menempelkan contoh Anda ke dalam sebuah file; itu berjalan dengan baik di bawah pesta. Saya tidak melihat ada masalah dengan itu.

Untuk ukuran yang baik, Anda mungkin ingin memastikannya diakhiri dengan baris baru, meskipun bash seharusnya tidak peduli. (Ini berjalan untuk saya dengan dan tanpa baris baru terakhir.)

Terkadang Anda akan melihat kesalahan aneh jika Anda tidak sengaja menyematkan karakter kontrol di file. Karena ini adalah skrip pendek, coba buat skrip baru dengan menempelkannya dari pertanyaan Anda di sini di StackOverflow, atau cukup dengan mengetiknya kembali.

Versi bash apa yang Anda gunakan? ( bash --version)

Semoga berhasil!

Adam Liss
sumber
0

Pastikan nama direktori tempat file .sh ada tidak memiliki karakter spasi. misalnya: Katakanlah jika itu ada di folder bernama 'Folder Baru', Anda pasti menemukan kesalahan yang telah Anda kutip. Sebagai gantinya, beri nama sebagai 'New_Folder'. Saya harap ini membantu.


sumber
0

Rupanya, beberapa versi shell juga dapat mengeluarkan pesan ini ketika baris terakhir dari skrip Anda tidak memiliki baris baru.

tripleee
sumber
0

Di Ubuntu:

$ gedit ~/.profile

Lalu, File -> Save asdan setel end linekeUnix/Linux

Cotok
sumber
0

Untuk orang yang menggunakan MacOS:

Jika Anda menerima file dengan format Windows dan ingin berjalan di MacOS dan melihat kesalahan ini, jalankan perintah ini.

brew install dos2unix
sh <file.sh>
vmorusu
sumber
0

Dalam kasus saya, ada redundan \seperti berikut:

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
}

Ada tidak yang \pada akhirDATA.PATH_PREFIX ./afs/kinetics400

satu
sumber