วิธีรักษาตัวแบ่งบรรทัดเมื่อจัดเก็บเอาต์พุตคำสั่งไปยังตัวแปร


107

ฉันใช้ bash shell บน Linux ฉันมีสคริปต์ง่ายๆนี้ ...

#!/bin/bash

TEMP=`sed -n '/'"Starting deployment of"'/,/'"Failed to start context"'/p' "/usr/java/jboss/standalone/log/server.log" | tac | awk '/'"Starting deployment of"'/ {print;exit} 1' | tac`
echo $TEMP

อย่างไรก็ตามเมื่อฉันเรียกใช้สคริปต์นี้

./temp.sh

ผลลัพธ์ทั้งหมดจะถูกพิมพ์โดยไม่มีการคืนแคร่ / ขึ้นบรรทัดใหม่ ไม่แน่ใจว่าเป็นวิธีที่ฉันจัดเก็บผลลัพธ์ไว้ที่ $ TEMP หรือคำสั่ง echo เอง

ฉันจะจัดเก็บเอาต์พุตของคำสั่งไปยังตัวแปรและรักษาการแบ่งบรรทัด / การส่งคืนค่าขนส่งได้อย่างไร


3
ค่าเหล่านี้จะถูกเก็บไว้ในตัวแปรได้ดี (ยกเว้นตัวแปรสุดท้าย) มันเป็นเสียงสะท้อนของคุณที่แตกสลาย ดูmywiki.wooledge.org/BashPitfallsรายการ # 14
Charles Duffy

1
นอกจากนี้ยังมีdon'tการจัดเก็บในcommands a แทนvariablesUsefunction
ฮันโซโล

คำตอบ:


208

อ้างตัวแปรของคุณ นี่คือเหตุผล:

$ f="fafafda
> adffd
> adfadf
> adfafd
> afd"

$ echo $f
fafafda adffd adfadf adfafd afd

$ echo "$f"
fafafda
adffd
adfadf
adfafd
afd

หากไม่มีเครื่องหมายคำพูดเชลล์จะแทนที่$TEMPด้วยอักขระที่มีอยู่ (ซึ่งหนึ่งในนั้นคือขึ้นบรรทัดใหม่) จากนั้นก่อนที่จะอัญเชิญechoแยกเปลือกที่สตริงเข้าสู่การขัดแย้งหลายใช้Internal Field Separator(ไอเอฟเอ) echoและผ่านที่ส่งผลให้รายชื่อของข้อโต้แย้ง โดยค่าเริ่มต้นIFSจะตั้งค่าเป็นช่องว่าง (ช่องว่างแท็บและบรรทัดใหม่) ดังนั้นเชลล์จะสับ$TEMPสตริงของคุณเป็นอาร์กิวเมนต์และจะไม่เห็นบรรทัดใหม่เนื่องจากเชลล์ถือว่าเป็นตัวคั่นเช่นเดียวกับช่องว่าง


xdotool type "$myVar"ไม่ทำงาน มันยังคงพิมพ์เนื้อหาของตัวแปรโดยไม่ขึ้นบรรทัดใหม่
azerafati

เกิดอะไรขึ้นถ้าคุณต้องการที่จะทำสิ่งที่ชอบFOO="$(echo $VAR)"; คุณจะพูดอย่างไรให้$VARถูกต้องเมื่ออยู่ในเครื่องหมายคำพูดแล้ว?
weberc2

@ weberc2 คุณเพียงแค่พูดอีกครั้ง: "$(echo "$VAR")". ใช่มันเป็นเรื่องแปลกที่จะแยกวิเคราะห์ แต่เห็นได้ชัดว่าเปลือกหอยง่ายกว่าสำหรับเรา
OJFord

3

ฉันพบปัญหาเดียวกันใบเสนอราคาจะช่วยได้

ubuntu@host:~/apps$ apps="abc
> def"
ubuntu@host:~/apps$ echo $apps
abc def
ubuntu@host:~/apps$ echo "$apps"
abc
def

2
การตอบคำถามเกือบ 5 ปีต่อมาโดยไม่เพิ่มรายละเอียดใหม่ใด ๆ ให้กับคำตอบก่อนหน้านี้หรือให้คำตอบใหม่ไม่ใช่ความคิดที่ดี โปรดหลีกเลี่ยงการโพสต์คำตอบประเภทนี้
MAChitgarha

1
รักความแม่นยำของ "เกือบ 5 ปี" ของคุณ @MAChitgarha :)
Neil Gatenby
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.