Score:0

ฉันมีปัญหากับ qoutes ในสคริปต์ทุบตี

ธง au

จะทำอย่างไรในสคริปต์นี้ซึ่งค้นหาบางสิ่งจากฐานข้อมูล เขาค้นหามันและเปลี่ยนชื่อในเทอร์มินัล ฉันมีปัญหากับคำพูดที่นี่ อาจมีใครรู้วิธีแก้ไขหรือไม่

spr-ustawien()
{
echo -e "\e[31;43mSprawdzanie UstawieÅ\e[0m \e[101mIP $1\e[0m"
อินเตอร์ทูป=0
ในขณะที่ [ $intertube -ne 1 ]; ทำ
ปิง $1 -c 5
ถ้า [ $? -eq 0 ]; แล้ว
sshpass -p (ผ่าน) ssh -t (ผู้ใช้)@$1 "
sudo sqlite3 config.sqlite "เลือก * จากการตั้งค่า" |grep "SALE_POINT" | awk '{sub(/SALE_POINT/,"\033[1mPunkt Sprzedaży:\033[0m")}1' &&
ทางออก "
เสียงสะท้อน -e "\e[1;5;32mSprawdzony\e[0m"
อินเตอร์ทูป=1;
อื่น
echo -e "\e[1;5;31m!!! JEST ออฟไลน์ !!!\e[0m"
หยุดพัก
ไฟ
เสร็จแล้ว
}
Tom Yan avatar
in flag
`"Punkt Sprzedaży"` ควรเป็น `\"Punkt Sprzedaży\"` หรือไม่
Black4Killer avatar
au flag
ยังไม่ทำงาน awk: บรรทัดที่ 1: ข้อผิดพลาดทางไวยากรณ์ที่หรือใกล้ [ ข้อผิดพลาด: อินพุตไม่สมบูรณ์
djdomi avatar
za flag
@Black4Killer โปรดอัปเดตคำถามด้วยสถานะปัจจุบันของโค้ด `sub(/SALE_POINT/,"\033[1mPunkt` ควรเป็นถ้าฉันเข้าใจกรณี `sub(/SALE_POINT/,\"\033[1mPunkt`if you don' ไม่ต้องการแปลอักขระพิเศษ อักขระนั้นต้องขึ้นต้นด้วย \CHAR โดยที่ char เป็นอักขระพิเศษ คุณยังสามารถดีบักได้เมื่อเริ่มคำสั่งเดียวกันด้วย `echo` ดังนั้นมันจะแสดงให้คุณเห็นว่ามันกำลังทำอะไร ความหมาย `echo sudo sqlite3 config .sqlite "เลือก * จากการตั้งค่า" |grep "SALE_POINT" | awk '{sub(/SALE_POINT/\,"\033[1mPunkt Sprzedaży:\033[0m\")}1' && ออก "`
Black4Killer avatar
au flag
@djdomi พวกเขาแสดงให้ฉันเห็น: ``` bash: /home/black/.bash_aliases: บรรทัดที่ 28: ข้อผิดพลาดทางไวยากรณ์ใกล้กับโทเค็นที่ไม่คาดคิด `)' ```
Score:3
ธง ph

สำหรับฉันแล้วดูเหมือนว่าปัญหาพื้นฐานคือเครื่องหมายคำพูดไม่ได้ซ้อนอยู่ในวิธีที่คุณใช้ใน จุ๊ๆ สั่งการ. นั่นคือในคำสั่งนี้:

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 -- จะชี้ให้เห็นถึงข้อผิดพลาดทั่วไปและแนวทางปฏิบัติที่ไม่ดีมากมาย

โพสต์คำตอบ

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