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?
bash
shell-script
array
IGGt
sumber
sumber
cat -v <script>
lihat apakah ada arang palsu.sh
tidakbash
dan menjalankannya sepertish scriptname.sh
yang salahJawaban:
Ketika Anda menggunakannya
./scriptname.sh
dijalankan dengan/bin/bash
seperti pada baris pertama dengan#!
. Tetapi ketika Anda menggunakannyash scriptname.sh
dieksekusish
, tidakbash
.The
sh
shell tidak memiliki sintaks untuk membuat array, tapi Bash memiliki sintaks yang digunakan.sumber
./
sejak sekarang. sorak-sorai#!/bin/sh
dansh script.sh
(atau#!/bin/bash
danbash script.sh
)a[index]=x
ataua=(x y)
). Beberapa penerjemah mendukung array, hanya ksh88 (tidak porting ke Linux AFAIK) dan beberapa varian pdksh lama akan mendukunga[index]=value
dan tidaka=(x y)
. Di Debian,sh
biasanyadash
yang tidak memiliki dukungan array (a[index]=x
tidak akan berfungsi).Menjalankan
./scriptname.sh
akan menghasilkan membaca baris pertama file dan melihat bahwa itu perlu menjalankan ´ / bin / bash´ dan meneruskan sisa skrip ke interpreter, sementara mengeksekusish scriptname.sh
akan meneruskan file ke shell standar pengguna (misalnya Ash) dan menjadi kasus bahwa penerjemah lain tidak mendukung array seperti Bash.sumber
sh
belum tentu merupakan "shell standar pengguna", ini sering dapat dieksekusi sendiri (atau symlink) dansh
akan dipanggil untuk memproses skrip. Itu akan benar jika bahkan jika shell login default untuk pengguna itu adalahbash
Dengan
sh scriptname.sh
, Anda menjalankannyash
, tidak harus denganbash
. Coba bandingkansh --version
di kedua mesin. Dan / atau dengandpkg -S $(which sh)
.sumber
sh
symlink kebash
itu akan berperilaku berbeda ketika dipanggil sebagaish