`ข้อผิดพลาดทางไวยากรณ์:“ (” ไม่คาดคิด” เมื่อสร้างอาร์เรย์


36

ฉันมีเซิร์ฟเวอร์ Linux (Debian) สองตัว ฉันกำลังสร้างเชลล์สคริปต์

ในครั้งแรกที่ฉันสร้างอาร์เรย์ดังนี้:

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

มันใช้งานได้ดี แต่เมื่อฉันเรียกใช้บนเซิร์ฟเวอร์อื่นฉันจะได้รับ:

Syntax error: "(" unexpected

เท่าที่ฉันสามารถบอกได้ว่าเซิร์ฟเวอร์ทั้งสองนั้นเหมือนกัน มีใครบ้างไหมที่จะเข้าใจว่าทำไมสิ่งนี้ถึงไม่ได้ผล?

ถ้าฉันพิมพ์ลงในเทอร์มินัลโดยตรงก็ดี


มันจะปรากฏว่าเมื่อฉันเรียกใช้เป็น

sh scriptname.sh

ฉันได้รับข้อผิดพลาด แต่ถ้าฉันเรียกใช้เป็น

./scriptname.sh

ดูเหมือนว่าจะโอเค ความแตกต่างคืออะไร?


คุณคัดลอกสคริปต์ระหว่างเซิร์ฟเวอร์ทั้งสองหรือไม่ พยายามที่cat -v <script>จะดูว่ามีถ่านเก๊
LilloX

2
shไม่เป็นbashเช่นนั้นและทำงานอย่างsh scriptname.shผิดปกติ
Eric Renouf

คำตอบ:


56

เมื่อคุณใช้./scriptname.shมันรันด้วยเช่นเดียวกับในบรรทัดแรกกับ/bin/bash #!แต่เมื่อคุณใช้sh scriptname.shมันจะshไม่bashทำงาน

shเปลือกมีไวยากรณ์การสร้างอาร์เรย์ไม่มี แต่ทุบตีมีไวยากรณ์ที่คุณใช้


ตกลงนั่นสมเหตุสมผลแล้ว อย่างที่คุณสามารถบอกได้ว่าฉันค่อนข้างใหม่กับ Linux (ปัจจุบันพยายามแปลงสคริปต์เชลล์ / สคริปต์ทุบตี Powershell ของฉัน) ฉันจะใช้งานต่อ./จากนี้ไป ไชโย
IGGt

นั่นคือไม่จำเป็นต้อง แต่จะต้องมีการประสานงานระหว่าง#!/bin/shและsh script.sh(หรือ#!/bin/bashและbash script.sh)
คอนสแตนติ Morenko

3
ภาษาดวลจุดโทษไม่มีอาร์เรย์ ( a[index]=xหรือa=(x y)) บางล่ามดวลจุดโทษสนับสนุนอาร์เรย์เพียง ksh88 (ไม่ได้แจ้งความกับลินุกซ์ AFAIK) และบางสายพันธุ์เก่า pdksh จะสนับสนุนและไม่ได้a[index]=value a=(x y)บนเดเบียนshมักจะdashไม่มีการรองรับอาเรย์ ( a[index]=xจะไม่ทำงาน)
Stéphane Chazelas

1
จากนี้ไปฉันจะตายเป็นชิ้น! :)
เปาโล

0

การรัน./scriptname.shจะส่งผลให้อ่านบรรทัดแรกของไฟล์และเห็นว่าจำเป็นต้องเรียกใช้ ´/ bin / bash´ และส่งส่วนที่เหลือของสคริปต์ไปยังล่ามในขณะที่การดำเนินการsh scriptname.shจะส่งไฟล์ไปยังเชลล์มาตรฐานของผู้ใช้ (เช่น Ash) และเป็นกรณีที่ล่ามอื่นไม่สนับสนุนอาร์เรย์เหมือนที่ Bash ทำ


1
shไม่จำเป็นต้องเป็น "เชลล์มาตรฐานของผู้ใช้" ซึ่งมักจะเป็นไฟล์ปฏิบัติการ (หรือ symlink) ของตัวเองและshจะถูกเรียกใช้เพื่อประมวลผลสคริปต์ นั่นจะเป็นจริงถ้าแม้ว่าเชลล์ล็อกอินเริ่มต้นสำหรับผู้ใช้นั้นคือbash
Eric Renouf

นั่นคือส่วนที่ฉันไม่แน่ใจทั้งหมดในขณะนี้ ขอขอบคุณสำหรับการชี้แจง!
dave_alcarin

0

ด้วยsh scriptname.shคุณจะใช้มันกับไม่จำเป็นต้องมีsh bashลองเปรียบเทียบsh --versionกับทั้งสองเครื่อง และ / dpkg -S $(which sh)หรือมี


แม้ว่าshการเชื่อมโยงไปยังbashมันจะทำงานแตกต่างกันเมื่อเรียกใช้เป็นsh
Eric Renouf
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.