สมมติว่าคุณมีสตริงที่มีช่องว่างเป็นตัวคั่น:
newline_separated=${space_separated// /$'\n'}
อย่างไรก็ตามคุณอาจถามคำถามผิด (ไม่จำเป็นเช่นนี้อาจเกิดขึ้นใน makefile) รายการชื่อไฟล์ที่คั่นด้วยช่องว่างไม่ได้ผลจริง: แล้วถ้าหนึ่งในชื่อไฟล์มีช่องว่าง
หากโปรแกรมได้รับชื่อไฟล์เป็นอาร์กิวเมนต์อย่าเข้าร่วมกับช่องว่าง ใช้"$@"
เพื่อเข้าถึงพวกเขาทีละคน แม้ว่าจะecho "$@"
พิมพ์อาร์กิวเมนต์ที่มีช่องว่างระหว่างนั้น แต่เนื่องจากecho
: มันพิมพ์อาร์กิวเมนต์ของมันด้วยช่องว่างเป็นตัวคั่น somecommand "$@"
ส่งชื่อไฟล์เป็นอาร์กิวเมนต์แยกไปยังคำสั่ง หากคุณต้องการพิมพ์อาร์กิวเมนต์ในบรรทัดที่แยกกันคุณสามารถใช้
printf '%s\n' "$@"
หากคุณมีชื่อไฟล์พื้นที่แยกออกจากกันและคุณต้องการที่จะนำพวกเขาในอาร์เรย์ที่จะทำงานกับพวกเขาคุณสามารถใช้การขยายตัวของตัวแปร unquoted จะแยกค่าที่ตัวอักษรบนIFS
(คุณจะต้องปิดการขยายตัวสัญลักษณ์แทนด้วยset -f
มิฉะนั้น glob รูปแบบจะถูกขยายในค่า):
space_separated_list='/path/to/file1 /path/to/file2 /path/to/file3'
IFS=' '; set -f
eval "array=(\$space_separated_list)"
for x in "${array[@]}"; do …
คุณสามารถแค็ปซูลในฟังก์ชันที่เรียกคืนการ-f
ตั้งค่าและมูลค่าIFS
เมื่อเสร็จสิ้น:
split_list () {
local IFS=' ' flags='+f'
if [[ $- = *f* ]]; then flags=; fi
set -f
eval "$1=($2)"
set $flags
}
split_list array '/path/to/file1 /path/to/file2 /path/to/file3'
for x in "${array[@]}"; do …