printf สตริงที่ยกมา

Oct 02 2020

ฉันกำลังพยายามสร้างตารางใน bash - ฉันได้รวบรวมส่วนหัวทั้งหมดไว้ใน var - อย่างไรก็ตามเมื่อฉันพิมพ์สตริงเหล่านี้ที่อยู่ใน "s จะถือว่าเป็นคอลัมน์ใหม่และไม่รวมกันโดยคำสั่ง printf

เมื่อฉันส่งผ่านค่าเดียวกันโดยตรงมันก็ใช้ได้ดี แต่ฉันได้รับพฤติกรรมที่แตกต่างออกไปเมื่อฉันใช้ $ var แทน

$ printf '%-20s' "some spaced words" other values; echo -e "\n"
some spaced words   other               values

$ values='"some spaced words" other values' $ echo $values "some spaced words" other values $ printf '%-20s' $values; echo -e "\n"
"some               spaced              words"              other               values

ฉันเข้าใจผิดอย่างชัดเจนว่าตัวแปรของฉันแตกต่างกันอย่างไร< some string >และส่งผลให้เกิดพฤติกรรมที่แตกต่างกัน

ฉันจะได้ผลลัพธ์ที่ตรงกับเอาต์พุต 1 เมื่อใช้ตัวแปรได้อย่างไร

แก้ไข: ฉันเห็นว่าเวอร์ชัน var มีเครื่องหมายคำพูด - มีวิธีใดบ้างที่ฉันสามารถส่งสตริงที่ยกมาให้ printf เป็นตัวแปรได้

คำตอบ

7 choroba Oct 02 2020 at 19:08

ตัวแปรจะถูกขยายก่อนที่เชลล์จะรันคำสั่งใด ๆ เช่นprintfที่นี่และการแยกคำจะเกิดขึ้นหลังจากการขยายตัวแปร ใช้อาร์เรย์แทนตัวแปรสเกลาร์:

values=('some spaced words' other values)
printf %-20s "${values[@]}"