ปัญหาของ Bash script: 'ประกาศ: ไม่พบ'


23

ฉันมีสคริปต์ซึ่งทำงานดี declare: not foundแต่เมื่อฉันวิ่งมันในวันนี้มันบอกว่า ฉันใช้ bash shell และพา ธ เมื่อเริ่มต้นสคริปต์ถูกต้อง

สองเส้นที่ถูกตั้งค่าสถานะในสคริปต์ของฉันมีดังนี้:

declare -a RESPONSE
RESPONSE=($RESULT)

นอกจากนี้ยังบอกว่า(ไม่คาดคิด แต่ฉันเดาว่าจะเกิดขึ้นเพราะข้อผิดพลาดแรก จุดที่ควรกล่าวถึงคือเมื่อฉันพิมพ์ประกาศทำงานได้ดี

declare | grep USER แสดงให้เห็นว่า

USER=ashfame
USERNAME=ashfame
           values="$SVN_BASH_USERNAME";

แล้วนี่มันอะไรผิด?

คำตอบ:


27

คุณกำลังใช้shแทนbash? sh(เชื่อมโยงกับdash) ไม่สนับสนุนdeclareคำหลักหรือไวยากรณ์

VAR=(list) 

สำหรับการเริ่มต้นอาร์เรย์


บรรทัด shebang ของฉันเป็น#!/bin/bashเพียง คุณหมายถึงวิธีที่ฉันเรียกใช้งานหรือไม่ ฉันเพิ่งลองดำเนินการตามที่./script.shได้ผล แต่มันไม่ทำงานscript.shหรือsh script.shและฉันค่อนข้างมั่นใจว่าฉันเคยใช้เพียงสองวิธีหลังในขณะที่ฉันสร้างมันขึ้นมาเมื่อสัปดาห์ที่แล้ว สิ่งใดที่สามารถอธิบายได้ว่า
Ashfame

@Ashfame: อาจจะเป็นสัปดาห์ที่ผ่านมามันพลาดคุณสมบัติที่เฉพาะเจาะจงสำหรับทุบตีคุณตอนนี้ดังนั้นมันจึงทำงานกับ sh script.sh
enzotib

ไม่ฉันหมายถึงสคริปต์นี้เคยทำงานเมื่อหนึ่งสัปดาห์หรือสองสัปดาห์ที่แล้ว หรือคุณหมายถึงการอัพเดทบางอย่างอาจมีการเปลี่ยนแปลงบ้างไหม?
Ashfame

@Ashfame: ฉันไม่รู้สคริปต์นี้ตามที่คุณแสดงตอนนี้ไม่สามารถทำงานกับ sh script.sh ได้
enzotib

11

ฉันสงสัยว่าคุณ "shebang" สาย (ตัวเลือกบรรทัดแรกของไฟล์) กำลังอ้างอิงแทนsh bashมันควรจะเป็น

#!/bin/bash

สำหรับสคริปต์ทุบตี หากบรรทัดแรกของสคริปต์ของคุณคือ

#!/bin/sh

จากนั้นจะระบุว่าจะใช้เชลล์ที่เข้ากันได้กับ bourne อย่างเคร่งครัด ในกรณีของ Ubuntu dashจะใช้ ในการแจกแจงอื่น ๆ สิ่งนี้ไม่ได้ทำให้เกิดปัญหาเพราะมันเชื่อมโยง/bin/shกับ/bin/bash; อย่างไรก็ตาม ubuntu ลิงก์ไปยัง/bin/dashเพื่อให้สคริปต์ของระบบทำงานได้เร็วขึ้น

declarebuiltin เป็นหนึ่งในbash's หลายส่วนขยายจากข้อมูลจำเพาะของสคริปต์บอร์นเปลือก; dashเพียงใช้ข้อมูลจำเพาะที่ไม่มีส่วนขยาย


กลุ่ม shebang ของฉัน#!/bin/bashเท่านั้น
Ashfame

@Affame: คุณเรียกใช้สคริปต์อย่างไร หากคุณกำลังเรียกใช้โดยเพียงพิมพ์ชื่อของสคริปต์บรรทัด shebang จะเป็นตัวกำหนดว่าล่ามตัวใดจะทำงาน แต่ถ้าคุณอย่างชัดเจนวิงวอนผ่านทางsh thescript.shที่shเปลือก - คือdashจะตีความมัน
intuited

1
@intuited sh script.shผมทำงานมันผ่าน ฉันเข้าใจสิ่งที่คุณพูด แต่ฉันได้อ่านบางที่ด้วยวิธีนี้bashจะตีความมัน ทำไมจะdashได้รับบทบาทที่นี่ ใช้กับ Ubuntu เท่านั้นหรือ อาจเป็นสิ่งที่ฉันอ่านสำหรับลินุกซ์โดยทั่วไป
Ashfame

2
@Ashfame กับsh scriptคุณกำลังเรียกใช้คำสั่งshด้วยอาร์กิวเมนต์scriptซึ่งทำให้ sh อ่านและดำเนินการคำสั่งในไฟล์นั้น shebang ไม่ได้ถูกอ่านโดย sh มันเริ่มต้นด้วย a #ดังนั้นจึงถือว่าเป็นความคิดเห็น หากคุณเรียกใช้แทน./scriptเคอร์เนลจะอ่าน Shebang ซึ่งในกรณีของคุณ#!/bin/bashและมันจะรัน/bin/bash ./script
geirha

@geirha ใช่นั่นเป็นวิธีที่ฉันรู้ว่ามันทำงานได้ แต่ @intuited พูดถึงว่าdashจะใช้ดังนั้นฉันต้องชี้แจงมัน
Ashfame

3

วิธีการทำซ้ำข้อผิดพลาดดังกล่าว:

ฉันใช้ Ubuntu 14.04 64 บิต ใส่รหัสนี้ในไฟล์:

#!/bin/sh 
declare -i FOOBAR=12; 
echo $FOOBAR; 

เรียกใช้เช่นนี้:

el@apollo:~$ ./06.sh 
./test.sh: 2: ./test.sh: declare: not found

หากต้องการแก้ไขให้ทำสิ่งนี้แทน:

#!/bin/bash
declare -i FOOBAR=12;
echo $FOOBAR;

พิมพ์:

el@apollo:~$ ./06.sh 
12

1

ฉันมีปัญหาเดียวกันจากนั้นฉันจำได้ว่าคุณต้องกำหนดสิทธิ์ที่ถูกต้องในการเรียกใช้งานเชลล์สคริปต์

เปลี่ยนการอนุญาตของสคริปต์ตัวอย่างเช่น:

chmod 755 script.sh

1

ลองเรียกใช้สคริปต์ของคุณโดยใช้/bin/bashในบรรทัดคำสั่งแทนหากsh (:

แทน :

    sh script.sh

ลอง :

    / bin / bash script.sh

1

บน Ubuntu คุณอาจมีสคริปต์ที่ใช้งานสคริปต์อื่น ๆ ที่อยู่ภายในซึ่งฉันพบ

some_dir/  
        | main.sh  
        | shhh.sh

#!/bin/bash -e

echo "file? $0"
# file? ./main.sh

echo "shell? $SHELL" 
# shell? /bin/bash

# sh shhh.sh
# file? shhh.sh
# shell? /bin/bash
# shhh.sh: 5: shhh.sh: declare: not found

$SHELL shhh.sh
# file? shhh.sh
# shell? /bin/bash
# foo? bar

#!/bin/bash -e

echo "file? $0"
# shhh.sh

echo "shell? $SHELL"
# shell? /bin/bash

declare foo="bar"

echo "foo? $foo"

การเปลี่ยนทั้งหมดsh some_script.shเพื่อ$SHELL some_script.shแก้ไข

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