Saya ingin menetapkan hasil ekspresi ke variabel dan menyatukannya dengan string, lalu menggemakannya. Inilah yang saya punya:
#!/bin/bash
cd ~/Desktop;
thefile= ls -t -U | grep -m 1 "Screen Shot";
echo "Most recent screenshot is: "$thefile;
Tapi itu menghasilkan:
Screen Shot 2011-07-03 at 1.55.43 PM.png
Most recent screenshot is:
Jadi, sepertinya itu tidak ditugaskan $thefile
, dan sedang dicetak saat dijalankan.
Jawaban:
Tugas shell adalah kata tunggal, tanpa spasi setelah tanda sama dengan. Jadi, apa yang Anda tulis memberikan nilai kosong ke
thefile
; lebih jauh, karena tugas dikelompokkan dengan perintah, itu membuatthefile
variabel lingkungan dan tugas adalah lokal untuk perintah tertentu, yaitu hanya panggilan untukls
melihat nilai yang ditugaskan.Anda ingin menangkap output dari suatu perintah, jadi Anda perlu menggunakan substitusi perintah :
(Beberapa literatur menunjukkan sintaks alternatif
thefile=`ls …`
; sintaks backquote setara dengan sintaks dolar-kurung kecuali bahwa mengutip dalam backquotes kadang-kadang aneh, jadi gunakan saja$(…)
.)Keterangan lain tentang skrip Anda:
-t
(urutkan berdasarkan waktu) dengan-U
(jangan urutkan) tidak masuk akal; gunakan saja-t
.Daripada menggunakan
grep
untuk mencocokkan tangkapan layar, lebih jelas untuk meneruskan wildcard kels
dan gunakanhead
untuk mengambil file pertama:Ini umumnya ide yang buruk untuk mengurai output
ls
. Ini bisa gagal sangat buruk jika Anda memiliki nama file dengan karakter yang tidak dapat dicetak. Namun, menyortir file berdasarkan tanggal sulit tanpals
, jadi ini solusi yang dapat diterima jika Anda tahu Anda tidak akan memiliki karakter yang tidak diinginkan atau garis miring terbalik dalam nama file.Selalu gunakan tanda kutip ganda di sekitar substitusi variabel , yaitu di sini tulis
Tanpa tanda kutip ganda, nilai variabel diekspansi ulang, yang akan menyebabkan masalah jika berisi spasi putih atau karakter khusus lainnya.
set -e
. Ini memberi tahu shell untuk keluar jika ada perintah yang gagal (dengan mengembalikan status bukan nol).Jika Anda memiliki GNU find (khususnya jika Anda menjalankan Linux atau Cygwin yang tidak tertanam), ada pendekatan lain untuk menemukan file terbaru: miliki
find
daftar file dan tanggalnya, dan gunakansort
dantail
untuk mengekstrak file termuda.Jika Anda ingin menulis skrip ini di zsh daripada bash, ada cara yang jauh lebih mudah untuk menangkap file terbaru, karena zsh memiliki kualifikasi global yang memungkinkan kecocokan wildcard tidak hanya pada nama tetapi juga pada metadata file. Bagian
(om[1])
setelah polanya adalah kualifikasi bola dunia;om
mengurutkan kecocokan dengan bertambahnya usia (yaitu dengan waktu modifikasi, yang terbaru lebih dulu) dan[1]
mengekstrak kecocokan pertama saja. Seluruh kecocokan harus dalam tanda kurung karena secara teknis ini adalah array, karena globbing mengembalikan daftar file, bahkan jika itu[1]
berarti bahwa dalam kasus khusus ini daftar berisi (paling banyak) satu file.sumber
Jika Anda ingin melakukannya dengan multiline / beberapa perintah / s maka Anda dapat melakukan ini:
Atau:
Contoh:
Keluaran:
sumber
output=$(echo $someVariable)