Pure Bash ไม่มียูทิลิตี้ภายนอก
การสาธิตนี้ใช้เหตุผลทั้งหมด แต่คุณสามารถละเว้นการลบความยาวของสตริงที่สองได้หากคุณต้องการให้เส้นด้านขวาขาด
pad=$(printf '%0.1s' "-"{1..60})
padlength=40
string2='bbbbbbb'
for string1 in a aa aaaa aaaaaaaa
do
printf '%s' "$string1"
printf '%*.*s' 0 $((padlength - ${#string1} - ${#string2} )) "$pad"
printf '%s\n' "$string2"
string2=${string2:1}
done
น่าเสียดายที่ในเทคนิคนั้นความยาวของสตริงแพดจะต้องถูกเข้ารหัสให้ยาวกว่าที่ยาวที่สุดที่คุณคิดว่าคุณต้องการ แต่ความยาวของแพดอาจเป็นตัวแปรตามที่แสดง อย่างไรก็ตามคุณสามารถแทนที่บรรทัดแรกด้วยสามบรรทัดนี้เพื่อให้สามารถใช้ตัวแปรสำหรับความยาวของแผ่นได้:
padlimit=60
pad=$(printf '%*s' "$padlimit")
pad=${pad// /-}
ดังนั้นแพด ( padlimit
และpadlength
) อาจเป็นไปตามความกว้างของเทอร์มินัล ( $COLUMNS
) หรือคำนวณจากความยาวของสตริงข้อมูลที่ยาวที่สุด
เอาท์พุต:
a--------------------------------bbbbbbb
aa--------------------------------bbbbbb
aaaa-------------------------------bbbbb
aaaaaaaa----------------------------bbbb
โดยไม่ต้องลบความยาวของสตริงที่สอง:
a---------------------------------------bbbbbbb
aa--------------------------------------bbbbbb
aaaa------------------------------------bbbbb
aaaaaaaa--------------------------------bbbb
บรรทัดแรกอาจเทียบเท่าแทน (คล้ายกับsprintf
):
printf -v pad '%0.1s' "-"{1..60}
หรือในทำนองเดียวกันสำหรับเทคนิคแบบไดนามิกมากขึ้น:
printf -v pad '%*s' "$padlimit"
คุณสามารถพิมพ์ทั้งหมดในบรรทัดเดียวได้หากต้องการ:
printf '%s%*.*s%s\n' "$string1" 0 $((padlength - ${#string1} - ${#string2} )) "$pad" "$string2"