ฉันอ่านกระทู้นี้: วิธีการวนรอบไฟล์?
คือIFS
อะไร และการใช้งานในบริบทของ - for
ลูปคืออะไร?
ฉันอ่านกระทู้นี้: วิธีการวนรอบไฟล์?
คือIFS
อะไร และการใช้งานในบริบทของ - for
ลูปคืออะไร?
คำตอบ:
IFS
ย่อมาจาก- มันเป็นตัวละครที่แยกฟิลด์ ในตัวอย่างที่คุณโพสต์จะถูกตั้งเป็นอักขระบรรทัดใหม่ ( ); ดังนั้นหลังจากที่คุณตั้งค่ามันจะประมวลผลบรรทัดข้อความต่อบรรทัด ในตัวอย่างนั้นคุณสามารถเปลี่ยนค่าของ(เป็นตัวอักษรบางตัวที่คุณมีในไฟล์อินพุต) และตรวจสอบว่าจะแยกข้อความอย่างไรInput
Internal Field Separator
\n
for
IFS
BTW จากคำตอบที่คุณโพสต์โซลูชันที่สองคือแนะนำ ...
ในฐานะที่เป็น@jasonwryanสังเกตเห็นก็ไม่ได้แต่Input
Internal
ชื่อInput
มาจากawk
ที่มีอยู่ยัง-OFS
Output Field Separator
S
มีไว้สำหรับคั่นในเปลือกเป้าหมายที่มันมาจาก ในเปลือกกรและอื่น ๆ ส่วนใหญ่บอร์นเหมือนเปลือกเป็นที่ได้รับในขณะนี้ที่ระบุไว้ตามPOSIX
ที่S
เป็นตัวคั่น (เพียงยืดจินตนาการของคุณบิต) เป็นA::B:
เช่นนี้แบ่งออกเป็น "A", "" และ "B" (ไม่มีการพิเศษ "") ที่แตกต่างจากawk
's FS
หรือธงขยายตัวพารามิเตอร์ของs
zsh
IFS
ไม่เกี่ยวข้องโดยตรงกับการวนซ้ำมันเกี่ยวข้องกับการแยกคำ IFS
กำหนดทางอ้อมว่าเอาต์พุตจากคำสั่งแบ่งออกเป็นชิ้นส่วนที่วนซ้ำ
เมื่อคุณมีการทดแทนตัวแปรที่ไม่มีการป้องกัน$foo
หรือการทดแทนคำสั่ง$(foo)
มีสองกรณี:
"$foo"
หรือในการกำหนดตัวแปรx=$foo
ดังนั้นสตริงที่เป็นผลมาจากการแทนที่จะถูกใช้ตามที่เป็นอยู่$IFS
จะถือเป็นตัวแยกคำ ตัวอย่างเช่นIFS=":"; foo="12:34::78"; echo $foo
พิมพ์12 34 78
(ที่มีสองช่องว่างระหว่าง34
และ78
เนื่องจากมีคำว่าง)foo="*"; echo $foo
พิมพ์รายการของไฟล์ในไดเรกทอรีปัจจุบันสำหรับลูปเช่นเดียวกับบริบทอื่น ๆ คาดหวังรายการคำ ดังนั้น
for x in $(foo); do …
แบ่ง$(foo)
ออกเป็นคำและถือว่าแต่ละคำเป็นรูปแบบกลม ค่าเริ่มต้นของIFS
เป็นพื้นที่แท็บและการขึ้นบรรทัดใหม่ดังนั้นถ้าfoo
พิมพ์ออกมาสองเส้นhello world
และhowdy
แล้วร่างกายห่วงจะถูกดำเนินการด้วยx=hello
แล้วและx=world
x=howdy
หากIFS
มีการเปลี่ยนแปลงอย่างชัดเจนที่จะมีการขึ้นบรรทัดใหม่เท่านั้นแล้ววงที่จะดำเนินการสำหรับการและhello world
howdy
หากIFS
มีการเปลี่ยนแปลงจะเป็นo
แล้ววงที่จะดำเนินการสำหรับhell
, w
, rldh
(ที่
เป็นตัวอักษรขึ้นบรรทัดใหม่) wdy
และ
"IFS indirectly determines how ..."
?
IFS
โดยตรง
จาก man bash
IFS The Internal Field Separator ที่ใช้สำหรับการแบ่งคำหลังจากการขยายและเพื่อแยกบรรทัดเป็นคำด้วยคำสั่ง read builtin ค่าเริ่มต้นคือ "<space> <tab> <newline>"
นี่เป็นหนึ่งในตัวแปรภายในของ Bash มันเป็นตัวกำหนดว่า Bash รู้จักฟิลด์หรือขอบเขตของคำอย่างไรเมื่อตีความสตริงอักขระ
ในขณะที่มันเริ่มต้นที่ช่องว่าง (พื้นที่แท็บและขึ้นบรรทัดใหม่) มันอาจมีการเปลี่ยนแปลงตัวอย่างเช่นในการแยกไฟล์ข้อมูลที่คั่นด้วยเครื่องหมายจุลภาค
นอกจากนี้คำตอบที่ดีก่อนหน้านี้ให้ฉันเพียงแค่เพิ่มที่ไอเอฟเอเป็นประโยชน์อย่างมากสำหรับการแยกที่มีประสิทธิภาพและแบบพกพาในกรณีที่เรียบง่ายในการรวมกันกับชุด มีประสิทธิภาพเพราะหลีกเลี่ยงการใช้ subshells และเครื่องมือวางไข่เช่น grep หรือ sed:
resolutions="640x480,320x240"
xIFS=$IFS
IFS=','
for res in $resolutions; do
xxIFS=$IFS
IFS='x'
set -- $res
width=$1
height=$2
# handle width and height
IFS=$xxIFS
done;
IFS=$xIFS
เพียงแค่ทราบว่าเราต้องจัดเก็บและกู้คืนค่าก่อนหน้าของIFSเพื่อหลีกเลี่ยงการแตกที่ไม่พึงประสงค์ในส่วนอื่น ๆ ของสคริปต์