GNU/Linux >> Belajar Linux >  >> Linux

kesalahan sintaksis di dekat token tak terduga ' - bash

Terima kasih @jdt atas jawaban Anda.

Setelah itu, dan karena saya terus mengalami masalah dengan carriage return, saya menulis skrip kecil itu. Hanya jalankan carriage_return dan Anda akan diminta untuk "membersihkan" file tersebut.

https://Gist.github.com/kartonnade/44e9842ed15cf21a3700

alias carriage_return=remove_carriage_return
remove_carriage_return(){

# cygwin throws error like : 
# syntax error near unexpected token `$'{\r''
# due to carriage return
# this function runs the following
# cat originalfile | tr -d "\r" > newfile

read -p "File to clean ? "
file_to_clean=$REPLY
temp_file_to_clean=$file_to_clean'_'

# file to clean => temporary clean file
remove_carriage_return_one='cat '$file_to_clean' | tr -d "\r" > '
remove_carriage_return_one=$remove_carriage_return_one$temp_file_to_clean

# temporary clean file => new clean file
remove_carriage_return_two='cat '$temp_file_to_clean' | tr -d "\r" > '
remove_carriage_return_two=$remove_carriage_return_two$file_to_clean

eval $remove_carriage_return_one
eval $remove_carriage_return_two
# remove temporary clean file 
eval 'rm '$temp_file_to_clean

}


Ini bisa menjadi masalah penyandian file.

Saya mengalami masalah penyandian jenis file saat mengerjakan file antara sistem operasi dan editor yang berbeda - dalam kasus saya khususnya antara sistem Linux dan Windows.

Saya sarankan untuk memeriksa penyandian file Anda untuk memastikannya cocok untuk lingkungan linux target. Saya kira masalah penyandian lebih kecil kemungkinannya karena Anda menggunakan MAC dibandingkan jika Anda menggunakan editor teks Windows, namun menurut saya penyandian file masih layak dipertimbangkan.

--- EDIT (Tambahkan solusi aktual seperti yang direkomendasikan oleh @Potatoswatter)

Untuk mendemonstrasikan bagaimana pengkodean tipe file bisa menjadi masalah ini, saya menyalin/menempel skrip contoh Anda ke Notepad di Windows (saya tidak memiliki akses ke Mac), lalu menyalinnya ke mesin linux dan menjalankannya:

[email protected]:~/windows> sh ./originalfile             
./originalfile: line 2: syntax error near unexpected token `$'{\r''
'/originalfile: line 2: `test() {

Dalam hal ini, Notepad menyimpan file dengan carriage return dan linefeeds, menyebabkan kesalahan yang ditunjukkan di atas. \r menunjukkan carriage return (sistem Linux mengakhiri baris dengan umpan baris \n hanya).

Pada mesin linux, Anda dapat menguji teori ini dengan menjalankan perintah berikut untuk menghapus carriage return dari file, jika ada:

cat originalfile | tr -d "\r" > newfile

Kemudian coba jalankan file baru sh ./newfile . Jika ini berhasil, masalahnya adalah carriage return sebagai karakter tersembunyi.

Catatan: Ini bukan replikasi yang tepat dari lingkungan Anda (saya tidak memiliki akses ke Mac), namun menurut saya masalahnya adalah bahwa editor, di suatu tempat, kereta yang disimpan kembali ke dalam file.

--- /EDIT

Untuk menguraikan sedikit, sistem operasi dan editor dapat memiliki default pengkodean file yang berbeda. Biasanya, aplikasi dan editor akan memengaruhi pengkodean tipe file yang digunakan, misalnya, menurut saya Microsoft Notepad dan Notepad++ default ke Windows-1252. Mungkin ada perbedaan baris baru yang perlu dipertimbangkan juga (Di lingkungan Windows, carriage return dan linefeed sering digunakan untuk mengakhiri baris dalam file, sedangkan di Linux dan OSX, biasanya hanya Linefeed yang digunakan).

Pertanyaan dan jawaban serupa yang mereferensikan penyandian file ada di sini:karakter buruk muncul dalam eksekusi skrip bash


coba sesuatu seperti

$ sudo apt-get install dos2unix
$ dos2unix offendingfile

Cara mudah mengonversi example.sh file ke UNIX jika Anda bekerja di Windows menggunakan NotePad++ (Edit>Konversi EOL>Format UNIX/OSX)

Anda juga dapat mengatur EOL default di notepad++ (Pengaturan>Preferensi>Dokumen Baru/Direktori Default>pilih Unix/OSX di bawah kotak Format)


Linux
  1. Basa'?

  2. Mengapa File Terjemahan Bash Tidak Berisi Semua Teks Kesalahan?

  3. Bash:Kesalahan Sintaks Dekat Token Tak Terduga `}'?

  1. Penanganan kesalahan dalam skrip Bash

  2. Bagaimana cara memeriksa sintaks sudoers

  3. Beberapa Operator Logika, ((a || B) &&C), Dan “Kesalahan sintaksis Dekat Token Tak Terduga”?

  1. Kesalahan tar:EOF tak terduga dalam arsip

  2. Kesalahan sintaks:akhir file tidak terduga (mengharapkan saat itu)

  3. Kesalahan sintaksis di dekat token tak terduga 'lalu'