วิธีการแยกสตริงหลังและก่อนที่ช่องว่างในเชลล์สคริปต์?


18

ฉันมีตัวแปรที่แสดงในเสียงก้องเช่นนี้

$ echo $var
129 148

ฉันต้องเอา 129 ออกไปเท่านั้น ฉันจะแยก 129 และ 148 ได้อย่างไร


echo "${var% *}" && echo "${var#* }"...
jasonwryan

มีความเป็นไปได้ที่ซ้ำกันของ$ {0 ## * /} และ $ {0% / *} ทำงานอย่างไร
jasonwryan

คำตอบ:


32

นอกจากคำแนะนำของ jasonwryanแล้วคุณสามารถใช้cut:

echo $var | cut -d' ' -f1

ข้างบน cutของการechoส่งออกที่มีตัวคั่นช่องว่าง ( -d ' ') และส่งออกสนามแรก ( -f1)


มันไม่ทำงาน. ฉันใช้มันไปแล้ว มันบอกว่าไม่พบคำสั่ง
surbhi

3
@surbhi ไม่พบคำสั่งว่าอะไร cutเป็นยูทิลิตี้มาตรฐาน สคริปต์ของคุณอาจมีข้อผิดพลาดที่อื่น โดยทั่วไปอย่าพูดว่า“ ใช้งานไม่ได้” บอกทุกครั้งว่าคุณใช้รหัสอะไรเกิดอะไรขึ้นและคัดลอกข้อความผิดพลาด
Gilles 'หยุดความชั่วร้าย'

คำตอบนี้ควรได้รับการยอมรับเนื่องจากเป็นวิธีที่กระชับและตรงที่สุด มันจะไม่ทำงานในกรณีที่ซับซ้อนกว่าตัวอย่างที่กำหนดแน่นอน
Dan Nguyen

10

วิธีที่เรียบร้อยในการทำเช่นนี้คือใช้ bash array เพื่อแยกสตริงในช่องว่าง คุณสามารถประกาศอาร์เรย์ได้ง่ายๆโดยใช้วงเล็บ:

var="129 148     181"
vars=( $var )
echo "First  word of var: '${vars[0]}'"
echo "Second word of var: '${vars[1]}'"
echo "Third  word of var: '${vars[2]}'"
echo "Number of words in var: '${#vars[@]}'"

คำสั่งนี้ไม่พบคำสั่ง
surbhi

ขึ้นอยู่กับคุณด้วยการใช้ bash หากคุณกำลังใช้เปลือกที่แตกต่างกันมันอาจไม่ทำงาน echo $SHELLควรแสดง: /bin/bashหรือคล้ายกัน
gogoud

ใช้งานไม่ได้zsh(
TonyH

สิ่งนี้ใช้ได้ในZSH zoom="one two three"; declare -a zoomie=( $( echo $zoom | cut -d' ' -f1- ) ); echo ${zoomie[2]};
TonyH
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.