Mengarahkan output ke variabel?

9

Saya menarik dalam mengarahkan output dari dua perintah ke variabel. Saya tidak ingin output ditampilkan di layar, tetapi ditugaskan ke variabel dalam skrip saya sehingga saya dapat menggunakannya lagi.

apa yang saya lakukan adalah mendapatkan ukuran file dari direktori menggunakan perintah yang terlihat di bawah ini:

ls -l /var/spool | wc -c

Perintah ini memberi saya ukuran file dalam byte dan menampilkan output sebagai integer. Saya tertarik untuk mendapatkan integer ini ditugaskan ke variabel yang saya sukai sehingga saya bisa membandingkannya dengan variabel lain nanti

Ini sepertinya tidak berhasil:

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

Apakah pengalihan bekerja?

Seperti ini....

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

Either way saya ingin output numerik ini ditugaskan untuk variabel dan tidak ditampilkan di layar.

Setiap saran sangat disambut!

Justin
sumber

Jawaban:

12

Tampaknya cukup mudah.

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

Sintaks shell $(command)dijalankan command, dan mengembalikan output standar: simpan saja dalam variabel.

Perintah Anda:

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

akan membuat file bernama sizedi direktori saat ini (berisi nomor dan baris baru).

Rmano
sumber
atau back-mengutip perintah: size=`ls -l /var/spool | wc -c`. gunakan format ini dalam jawaban Anda: "` `size =` ls -l / var / spool | wc -c` `` "tanpa tanda kutip ganda;)
αғsнιη
1
@KasiyA Saya lebih suka menggunakan $()untuk alasan yang dijelaskan di sini: stackoverflow.com/a/9449788/2907484 :-)
Rmano
1
(1) Setelah melakukan ls -l /var/spool | wc -c > size_file, Anda bisa read size_var < size_file. (2) Lihat juga Bisakah $ () selalu mengganti backticks untuk substitusi perintah?
G-Man Mengatakan 'Reinstate Monica'
6

Saya lebih suka solusi yang ditawarkan oleh jawaban Rmano , tetapi jika Anda hanya ingin menggunakan pengalihan:

read size < <(ls -l /var/spool | wc -c)
Radu Rădeanu
sumber
1
Manfaat utama dari hanya menggunakan redirection adalah bahwa hal itu tidak menelan kesalahan (tergantung pada bagaimana Anda memiliki naskah Anda diatur untuk pengolahan pipa - set -e, set -o pipefail, dll). Jadi, jika Anda menggunakan $(…)skrip Anda akan selalu melanjutkan, sedangkan dengan pengalihan itu dapat diatur untuk gagal. (yang mungkin apa yang Anda inginkan, atau tidak).
Garrett Motzner