การเปลี่ยนทิศทางเอาต์พุตไปยังตัวแปรหรือไม่?


9

ฉันสนใจในการควบคุมผลลัพธ์จากสองคำสั่งไปยังตัวแปร ฉันไม่ต้องการให้แสดงผลบนหน้าจอ แต่มอบหมายให้กับตัวแปรภายในสคริปต์ของฉันเพื่อให้ฉันสามารถใช้มันได้อีกครั้ง

สิ่งที่ฉันทำคือการรับขนาดไฟล์จากไดเรกทอรีโดยใช้คำสั่งด้านล่าง:

ls -l /var/spool | wc -c

คำสั่งนี้ทำให้ฉันมีขนาดไฟล์เป็นไบต์และแสดงผลลัพธ์เป็นจำนวนเต็ม ฉันสนใจที่จะรับจำนวนเต็มนี้ที่กำหนดให้กับตัวแปรที่ฉันชอบเพื่อที่ฉันจะสามารถเปรียบเทียบกับตัวแปรอื่นได้ในภายหลัง

ดูเหมือนจะใช้งานไม่ได้:

size = ls -l /var/spool | wc -c

การเปลี่ยนเส้นทางจะทำงานได้หรือไม่

แบบนี้....

ls -l /var/spool | wc -c > size

ฉันต้องการให้เอาต์พุตตัวเลขนี้ถูกกำหนดให้กับตัวแปรและไม่แสดงบนหน้าจอ

ข้อเสนอแนะใด ๆ ยินดีมาก!

คำตอบ:


12

ดูเหมือนจะตรงไปตรงมามาก

romano@RRyS:~$ size=$(ls -l /var/spool | wc -c)
romano@RRyS:~$ echo $size
476

ไวยากรณ์เชลล์$(command)ดำเนินการcommandและส่งคืนเอาต์พุตมาตรฐาน: เพียงบันทึกไว้ในตัวแปร

คำสั่งของคุณ:

ls -l /var/spool | wc -c > size 

จะสร้างไฟล์ชื่อ sizeในไดเรกทอรีปัจจุบัน (มีจำนวนและขึ้นบรรทัดใหม่)


size=`ls -l /var/spool | wc -c`หรือกลับพูดคำสั่ง: ใช้รูปแบบนี้ในคำตอบของคุณ: "` `` size = คำสั่ง ls -l / var / spool | wc -c` ``" โดยไม่มีคำพูดคู่;)
αғsнιη

1
@KasiyA ฉันชอบที่จะใช้$()ด้วยเหตุผลที่อธิบายไว้ที่นี่: stackoverflow.com/a/9449788/2907484 :-)
Rmano

1
(1) หลังจากทำคุณทำได้ls -l /var/spool | wc -c > size_file read size_var < size_file(2) ดูเพิ่มเติม$ () สามารถแทนที่ backticks เพื่อทดแทนคำสั่งได้หรือไม่
G-Man กล่าวว่า 'Reinstate Monica'

6

ฉันชอบโซลูชันที่เสนอโดยคำตอบของ Rmanoแต่ถ้าคุณต้องการใช้การเปลี่ยนเส้นทางเท่านั้น:

read size < <(ls -l /var/spool | wc -c)

1
ประโยชน์หลักของการใช้การเปลี่ยนเส้นทางเดียวก็คือว่ามันไม่ได้กลืนข้อผิดพลาด (ขึ้นอยู่กับวิธีการที่คุณมีสคริปต์ของคุณตั้งค่าสำหรับการประมวลผลท่อ - set -e, set -o pipefailฯลฯ ) ดังนั้นหากคุณใช้$(…)สคริปต์ของคุณจะทำต่อไปในขณะที่การเปลี่ยนเส้นทางมันสามารถตั้งค่าให้ล้มเหลว (ซึ่งอาจเป็นสิ่งที่คุณต้องการหรือไม่)
Garrett Motzner
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.