`Sintaks kesalahan:" ("tak terduga` saat membuat array

37

Saya memiliki dua server Linux (Debian). Saya membuat skrip shell.

Pada yang pertama saya membuat array dengan demikian:

#!/bin/bash
target_array=(
    "/home/user/direct/filename -p123 -r"
)

Itu bekerja dengan baik. Tetapi ketika saya menjalankan ini di server lain saya mendapatkan:

Syntax error: "(" unexpected

Sejauh yang saya tahu kedua server adalah sama. Adakah yang bisa menjelaskan mengapa ini tidak berhasil?

Jika saya ketik langsung ke terminal, tidak apa-apa ??


Akan muncul bahwa ketika saya menjalankannya sebagai

sh scriptname.sh

Saya mendapatkan kesalahan, tetapi jika saya jalankan sebagai

./scriptname.sh

sepertinya baik-baik saja. Apa bedanya?

IGGt
sumber
Apakah Anda menyalin dan menempelkan skrip di antara kedua server? coba cat -v <script>lihat apakah ada arang palsu.
LilloX
2
shtidak bashdan menjalankannya seperti sh scriptname.shyang salah
Eric Renouf

Jawaban:

56

Ketika Anda menggunakannya ./scriptname.shdijalankan dengan /bin/bashseperti pada baris pertama dengan #!. Tetapi ketika Anda menggunakannya sh scriptname.shdieksekusi sh, tidak bash.

The shshell tidak memiliki sintaks untuk membuat array, tapi Bash memiliki sintaks yang digunakan.

Konstantin Morenko
sumber
Oke, itu masuk akal sekarang. Seperti yang Anda mungkin tahu saya cukup baru untuk Linux (saat ini mencoba untuk mengkonversi skrip shell / bash skrip Powershell saya). Saya akan tetap menggunakan ./sejak sekarang. sorak-sorai
IGGt
Itu belum tentu, tetapi harus ada koordinasi antara #!/bin/shdan sh script.sh(atau #!/bin/bashdan bash script.sh)
Konstantin Morenko
3
Bahasa sh tidak memiliki array ( a[index]=xatau a=(x y)). Beberapa penerjemah mendukung array, hanya ksh88 (tidak porting ke Linux AFAIK) dan beberapa varian pdksh lama akan mendukung a[index]=valuedan tidak a=(x y). Di Debian, shbiasanya dashyang tidak memiliki dukungan array ( a[index]=xtidak akan berfungsi).
Stéphane Chazelas
1
Aku bisa mati berkeping-keping mulai sekarang! :)
Paulo
0

Menjalankan ./scriptname.shakan menghasilkan membaca baris pertama file dan melihat bahwa itu perlu menjalankan ´ / bin / bash´ dan meneruskan sisa skrip ke interpreter, sementara mengeksekusi sh scriptname.shakan meneruskan file ke shell standar pengguna (misalnya Ash) dan menjadi kasus bahwa penerjemah lain tidak mendukung array seperti Bash.

dave_alcarin
sumber
1
shbelum tentu merupakan "shell standar pengguna", ini sering dapat dieksekusi sendiri (atau symlink) dan shakan dipanggil untuk memproses skrip. Itu akan benar jika bahkan jika shell login default untuk pengguna itu adalahbash
Eric Renouf
Itu adalah bagian di mana saya tidak sepenuhnya yakin saat ini. Terimakasih atas klarifikasinya!
dave_alcarin
0

Dengan sh scriptname.sh, Anda menjalankannya sh, tidak harus dengan bash. Coba bandingkan sh --versiondi kedua mesin. Dan / atau dengan dpkg -S $(which sh).

joepd
sumber
Bahkan jika shsymlink ke bashitu akan berperilaku berbeda ketika dipanggil sebagaish
Eric Renouf