Score:1

สคริปต์ทุบตีหยุดชั่วคราวหลังจากเปิด mysql

ธง br

ฉันกำลังพยายามเขียนสคริปต์ที่จะจัดการการบำรุงรักษาบางอย่างบนเซิร์ฟเวอร์ Ubuntu ของเราสำหรับเทคโนโลยีที่เข้าใจ Linux น้อยกว่าตัวฉันเอง

เมื่อฉันเรียกใช้สคริปต์ในฐานะผู้ดูแลระบบ (จำเป็นในการเข้าถึง mysql) สคริปต์จะแจ้งให้ฉันป้อนรหัสผ่านอย่างถูกต้อง คำสั่ง mysql เริ่มทำงานได้สำเร็จ แต่คำสั่งต่อไปนี้ไม่ทำงาน เทอร์มินัลจะอยู่ที่นั่นและไม่ดำเนินการต่อหรือล้มเหลว

ความคิดใด ๆ ที่ฉันทำผิดจะเป็นประโยชน์มากฉันได้ทำการวิจัยแล้ว แต่ไม่มีวิธีแก้ปัญหาและค่อนข้างยากสำหรับ Google

#! /ถัง/sh
mysql -p หมอก

ลบจาก `hosts` โดยที่ `hostID` = '0';
คำสั่ง #more DELETE ในนี้ ลบออกเพื่อความกระชับ
ลบออกจากงานโดยที่ taskTypeId=8;

$เชลล์
Score:0
ธง hr

เดอะ มายเอสคิวแอล คำสั่งคาดว่าจะอ่านคำสั่งจากอินพุตมาตรฐาน คุณสามารถระบุสิ่งนี้ในสคริปต์โดยใช้ a เอกสารที่นี่:

#! /ถัง/sh

mysql -p หมอก <<'EOF'
ลบจาก 'โฮสต์' โดยที่ 'hostID' = '0';
คำสั่ง #more DELETE ในนี้ ลบออกเพื่อความกระชับ
ลบออกจากงานโดยที่ taskTypeId=8;
อฟ

การควบคุมจะกลับไปที่เชลล์เมื่อ มายเอสคิวแอล ออกคำสั่ง อ้างครั้งแรก 'อีโอเอฟ' (หรือพอๆกัน \EOF หรือ "อีโอเอฟ") ป้องกันไม่ให้เชลล์ขยายเนื้อหา - ไม่ใช่ปัญหาสำหรับคำสั่งในตัวอย่างของคุณ แต่เป็นสิ่งที่ต้องการ เลือก * จาก มิฉะนั้นจะขยาย * ไปยังรายการไฟล์ สตริงที่แท้จริง อฟ เป็นไปตามอำเภอใจ

GBarron avatar
br flag
ขอบคุณ - ฉันเชื่อว่านี่ตอบคำถามของฉัน ฉันไม่สามารถบอกได้อย่างแน่นอนว่ามันใช้งานได้จริงหรือไม่ เมื่อฉันใช้เอกสาร here ตามที่แนะนำ Terminal จะปิดแทบจะในทันทีหลังจากป้อนรหัสผ่านของฉัน มัน *อาจ* ใช้งานได้ แต่ฉันไม่แน่ใจว่าเหตุใด $shell ที่ส่วนท้ายของสคริปต์จึงไม่ทำให้ Terminal เปิดอยู่ ฉันแค่ต้องการให้แน่ใจว่าทุกอย่างทำงานถูกต้องเป็นหลัก
GBarron avatar
br flag
ฉันยังอ่านเพิ่มเติมในเอกสารที่นี่ด้วย โดยพื้นฐานแล้วฉันยังใหม่กับ bash... ฉันรู้พื้นฐานของการไปยังส่วนต่างๆ ของ Terminal และฉันมีประสบการณ์เกี่ยวกับ PowerShell มาบ้าง แต่อย่างอื่นฉันยังใหม่กับ bash โดยสิ้นเชิง
hr flag
@GBarron ฉันแนะนำให้รันสคริปต์จากเชลล์แบบโต้ตอบจนกว่าคุณจะดีบั๊ก หากคุณ *ต้อง* เรียกใช้งานจาก Launcher บางชนิด การเพิ่มคำสั่ง `read` ควรเปิดเทอร์มินัลค้างไว้จนกว่าจะมีการกดปุ่ม หากคุณต้องการเปิดเชลล์ค้างไว้โดยเริ่มเชลล์ใหม่ คุณน่าจะต้องใช้ตัวพิมพ์ใหญ่ `$SHELL` แทนที่จะเป็น `$shell` (ซึ่งโดยค่าเริ่มต้นจะไม่ตั้งค่าเป็นอะไรเลย)
GBarron avatar
br flag
ขอบคุณอีกครั้ง คุณพูดถูก ฉันใส่ `$SHELL` ผิด `
GBarron avatar
br flag
นอกจากนี้ หลังจากที่ฉันป้อนรหัสผ่าน ฉันจะได้รับ: ```ข้อผิดพลาด 1064 (42000) ที่บรรทัด 2: คุณมีข้อผิดพลาดในไวยากรณ์ SQL ของคุณ; ตรวจสอบคู่มือที่ตรงกับเวอร์ชันเซิร์ฟเวอร์ MariaDB ของคุณสำหรับไวยากรณ์ที่ถูกต้องเพื่อใช้ใกล้ 'WHERE = '0'' ที่บรรทัด 1 ``` อย่างไรก็ตาม ฉันรู้ว่าคำสั่งนี้ใช้งานได้เมื่อป้อนด้วยตนเอง
hr flag
@GBarron หากคุณไม่อ้างอิง `EOF` และใช้ backquotes รอบ `hostID` เช่นเดียวกับต้นฉบับของคุณ เชลล์จะถือว่าเป็นการแทนที่คำสั่ง เนื่องจากอาจไม่มีคำสั่ง `hostID` ผลลัพธ์จะว่างเปล่า ส่งผลให้ไวยากรณ์ `WHERE = '0'` ไม่ถูกต้อง
GBarron avatar
br flag
ฉันเห็น- ขอบคุณอีกครั้งสำหรับเวลาของคุณ ใส่เครื่องหมายคำพูดด้านหลังและแก้ไขเชลล์ คำสั่งยังคงเปิดอยู่ในขณะนี้ ฉันไม่เห็นผลลัพธ์ใด ๆ จาก mysql ซึ่งแปลก แต่ฉันเชื่อว่ามันใช้งานได้แล้ว
Score:0
ธง in

ความเป็นไปได้อีกอย่างคือสร้าง 2 ไฟล์: ไฟล์หนึ่งสำหรับสคริปต์ทุบตีของคุณ (เช่น มายแบชอีกอันสำหรับคำสั่ง SQL (mydeletes.sql):

มายแบช

#! /ถัง/sh

mysql -p หมอก <<mydeletes.sql

mydeletes.sql

ลบจาก 'โฮสต์' โดยที่ 'hostID' = '0';
คำสั่ง #more DELETE ในนี้ ลบออกเพื่อความกระชับ
ลบออกจากงานโดยที่ taskTypeId=8;

สิ่งนี้จะแยกรหัส SQL ออกจากรหัสทุบตี มันจะช่วยให้คุณสามารถโหลด ดำเนินการ และดีบักสคริปต์ SQL ของคุณภายในเครื่องมือ SQL จำนวนมาก (หากไม่ใช่ทั้งหมด) (DBeaver, Workbench,...)

GBarron avatar
br flag
ขอบคุณ Marc อีกหนึ่งคำตอบทางเลือกที่ดี!

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา