`Sözdizimi hatası:“ (”beklenmeyen” dizisi oluştururken


36

İki tane (Debian) Linux sunucum var. Bir kabuk betiği oluşturuyorum.

İlkinde bir dizi yaratıyorum.

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

Bu iyi çalışıyor. Ancak bunu diğer sunucuda çalıştırdığımda şunu alıyorum:

Syntax error: "(" unexpected

Her iki sunucunun da aynı olduğunu söyleyebilirim. Birisi bunun neden işe yaramadığına ışık tutabilir mi?

Doğrudan terminale yazarsam sorun olmaz.


Göründüğü gibi göründüğü gibi

sh scriptname.sh

Hata alıyorum, ancak çalıştırırsam

./scriptname.sh

Tamam gibi görünüyor. Fark ne?


İki sunucu arasındaki betiği kopyalayıp yapıştırdınız mı? cat -v <script>sahte char olup olmadığını görmek için deneyin .
LilloX

2
shdeğil bashgibi çalışan ve bu yüzden sh scriptname.shyanlış
Eric Renouf

Yanıtlar:


56

Eğer kullandığınız zaman ./scriptname.shonunla yürütür /bin/bashilk satırda olduğu gibi #!. Ama kullandığınızda sh scriptname.sh, yürütür sh, değil bash.

shKabuk diziler oluşturmak için hiçbir sözdizimi vardır, ama Bash kullandığınız sözdizimi vardır.


Tamam, bu şimdi mantıklı. Muhtemelen söyleyebileceğiniz gibi Linux için oldukça yeniyim (şu anda Powershell scriptlerimi shell / bash scriptlerimi dönüştürmeye çalışıyorum). Bundan sonra kullanmaya devam edeceğim ./. Şerefe
IGGt

Bu mutlaka, ama arasında #!/bin/shve sh script.sh(veya #!/bin/bashve bash script.sh) arasında koordinasyon olması gerekir
Konstantin Morenko

3
Sh dilinin dizileri ( a[index]=xveya a=(x y)) yok. Bazı sh tercümanları dizileri destekler, yalnızca ksh88 (Linux AFAIK'e taşınmadı) ve bazı eski pdksh değişkenleri destekleyebilir a[index]=valueve desteklemez a=(x y). Debian'da, shgenellikle dashdizi desteği olmayan ( a[index]=xişe yaramaz).
Stéphane Chazelas

1
Bundan sonra parça olarak ölebilirim! :)
Paulo,

0

Çalıştırma ./scriptname.sh, dosyanın ilk satırını okuyacak ve “/ bin / bash” komutunu çalıştırması ve komut dosyasının geri kalanını tercümana sh scriptname.shiletmesi gerektiğini görürken, yürütme dosyayı kullanıcının standart kabuğuna (örn. Ash) geçirir. ve diğer tercümanların Bash'in yaptığı gibi dizileri desteklememesi durumunda.


1
shmutlaka "kullanıcının standart kabuğu" değildir, genellikle kendi çalıştırılabilir (veya sembolik bağlantısıdır) ve shbetiği işlemesi için çağrılır. Bu kullanıcı için varsayılan giriş kabuğu olsa bile, bu doğru olacaktırbash
Eric Renouf

Şu an tam olarak emin olamadığım kısım buydu. Açıklama için teşekkürler!
dave_alcarin

0

İle sh scriptname.sh, shmutlaka ile birlikte , onu çalıştırıyorsunuz bash. sh --versionHer iki makinede de karşılaştırmayı deneyin . Ve / veya ile dpkg -S $(which sh).


shBir bağlantı olsa bile , bashçağrıldığında farklı davranacaktırsh
Eric Renouf
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.