สำหรับฉันแล้วดูเหมือนว่าปัญหาพื้นฐานคือเครื่องหมายคำพูดไม่ได้ซ้อนอยู่ในวิธีที่คุณใช้ใน จุ๊ๆ
สั่งการ. นั่นคือในคำสั่งนี้:
sshpass -p (ผ่าน) ssh -t (ผู้ใช้)@$1 "
sudo sqlite3 config.sqlite "เลือก * จากการตั้งค่า" |grep "SALE_POINT" | awk '{sub(/SALE_POINT/,"\033[1mPunkt Sprzedaży:\033[0m")}1' &&
ทางออก "
เดอะ "
ใน "เลือก * จาก...
เป็นราคาปิด (ตรงกับราคาเปิดในบรรทัดก่อนหน้า) ดังนั้นแทนที่จะเป็น เลือก * จากการตั้งค่า
อยู่ในเครื่องหมายคำพูดสองชั้น จริง ๆ แล้วไม่มีเครื่องหมายคำพูด (และเป็นผลให้ *
จะขยายไปยังรายการไฟล์ในไดเร็กทอรีในเครื่อง ทำให้เกิดความสับสนอลหม่านใครจะรู้)
ดังที่ djdomi กล่าวไว้ในความคิดเห็น คุณสามารถดูสิ่งที่โต้แย้งได้ จุ๊ๆ
ดูเหมือนว่าหลังจากเชลล์แยกวิเคราะห์แล้ว (และดังนั้นสิ่งที่จะถูกส่งไปยังระบบรีโมตเพื่อดำเนินการ) โดยการแทนที่ จุ๊ๆ
สั่งการด้วย เสียงสะท้อน
. เมื่อฉันเรียกใช้สิ่งนี้:
เสียงสะท้อน "
sudo sqlite3 config.sqlite "เลือก * จากการตั้งค่า" |grep "SALE_POINT" | awk '{sub(/SALE_POINT/,"\033[1mPunkt Sprzedaży:\033[0m")}1' &&
ทางออก "
มันพิมพ์:
sudo sqlite3 config.sqlite เลือก file1.txt file2.jpg จากการตั้งค่า |grep SALE_POINT | awk '{sub(/SALE_POINT/,033[1mPunkt Sprzedaży:033[0m)}1' &&
ทางออก
วิธีแก้ไขโดยตรงที่สุดคือการหลีกเลี่ยงเครื่องหมายคำพูดคู่ภายใน ดังนั้นเชลล์ในเครื่องจะส่งผ่านไปยังเชลล์บนระบบรีโมต:
sshpass -p (ผ่าน) ssh -t (ผู้ใช้)@$1 "
sudo sqlite3 config.sqlite \"เลือก * จากการตั้งค่า\" |grep \"SALE_POINT\" | awk '{sub(/SALE_POINT/,\"\033[1mPunkt Sprzedaży:\033[0m\")}1' &&
ทางออก "
โปรดทราบว่าคุณต้องหลบหนี ทั้งหมด ของพวกเขาแม้กระทั่งที่อยู่ใน single-quoted อึดอัด
คำสั่ง เนื่องจาก single-quote เหล่านั้นไม่ได้มีความหมายอะไรกับเชลล์ในเครื่อง
... แต่ฉันขอแนะนำให้ทำให้ง่ายขึ้นเล็กน้อย ฉันไม่เห็นเหตุผลใด ๆ ที่ เกรป
และ อึดอัด
จำเป็นต้องรันบนระบบรีโมตมากกว่าระบบโลคัล (และ ทางออก
คำสั่งไม่ได้ทำอะไรที่เป็นประโยชน์เนื่องจากจะต้องออกต่อไป) คุณจึงสามารถย้าย เกรป
และ อึดอัด
คำสั่งภายนอก จุ๊ๆ
สั่งการ:
sshpass -p (ผ่าน) ssh -t (ผู้ใช้)@$1 "sudo sqlite3 config.sqlite \"เลือก * จากการตั้งค่า\"" |
เกรป "SALE_POINT" |
awk '{sub(/SALE_POINT/,"\033[1mPunkt Sprzedaży:\033[0m")}1'
และฉันมักจะเกลียดที่จะเห็น เกรป
ใช้มาก่อน อึดอัด
, เมื่อไร อึดอัด
สามารถทำทุกอย่างได้อย่างสมบูรณ์แบบ:
sshpass -p (ผ่าน) ssh -t (ผู้ใช้)@$1 "sudo sqlite3 config.sqlite \"เลือก * จากการตั้งค่า\"" |
awk '/SALE_POINT/ {sub(/SALE_POINT/,"\033[1mPunkt Sprzedaży:\033[0m"); พิมพ์}'
ฉันยังแนะนำให้อ้างอิงการอ้างอิงตัวแปรทั้งหมดแบบคู่ (เช่น ping "$1" -c 5
แทนที่จะเป็นเพียง ปิง $1 -c 5
) และแทนที่สิ่งนี้:
ปิง $1 -c 5
ถ้า [ $? -eq 0 ]; แล้ว
ด้วยเพียง:
ถ้า ping "$1" -c 5; แล้ว
และสุดท้ายนี้ฉันขอแนะนำ พิมพ์ฉ
แทน เสียงสะท้อน -e
-- มันเป็นวิธีที่สามารถคาดเดาได้มากขึ้น พิมพ์ฉ
ซับซ้อนกว่าเล็กน้อยในการใช้งาน -- อาร์กิวเมนต์แรกคือสตริงรูปแบบที่บอกวิธีการพิมพ์อาร์กิวเมนต์ที่เหลือ และจะไม่เพิ่มบรรทัดใหม่ที่ท้ายสุดโดยอัตโนมัติ (ดังนั้นให้เพิ่มอย่างชัดแจ้งด้วย \n
) -- แต่มีโอกาสน้อยที่จะแตกเนื่องจากการเปลี่ยนแปลงบางอย่างในเวอร์ชันของเชลล์ เสียงสะท้อน
(อย่างที่เกิดขึ้นกับฉันในขณะที่กลับ ... ) ดังนั้นใช้เช่น
printf "\e[31;43m%s\e[0m \e[101m%s1\e[0m\n" "Sprawdzanie UstawieÅ" "IP $1"
โอ้ และฉันแนะนำให้รันสคริปต์ของคุณตลอด shellcheck.net -- จะชี้ให้เห็นถึงข้อผิดพลาดทั่วไปและแนวทางปฏิบัติที่ไม่ดีมากมาย