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 membuat thefile
variabel lingkungan dan tugas adalah lokal untuk perintah tertentu, yaitu hanya panggilan untuk ls
melihat nilai yang ditugaskan.
Anda ingin menangkap output dari suatu perintah, jadi Anda perlu menggunakan substitusi perintah :
thefile=$(ls -t -U | grep -m 1 "Screen Shot")
(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:
- Menggabungkan
-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 ke ls
dan gunakan head
untuk mengambil file pertama:
thefile=$(ls -t *"Screen Shot"* | head -n 1)
Ini umumnya ide yang buruk untuk mengurai outputls
. Ini bisa gagal sangat buruk jika Anda memiliki nama file dengan karakter yang tidak dapat dicetak. Namun, menyortir file berdasarkan tanggal sulit tanpa ls
, 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
echo "Most recent screenshot is: $thefile"
Tanpa tanda kutip ganda, nilai variabel diekspansi ulang, yang akan menyebabkan masalah jika berisi spasi putih atau karakter khusus lainnya.
- Anda tidak perlu titik koma di akhir baris. Mereka mubazir tetapi tidak berbahaya.
- Dalam skrip shell, sering kali ide yang baik untuk dimasukkan
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 gunakan sort
dan tail
untuk mengekstrak file termuda.
thefile=$(find -maxdepth 1 -type f -name "*Screen Shot*" -printf "%T@ %p" |
sort -k 1n | tail -n 1)
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.
#!/bin/zsh
set -e
cd ~/Desktop
thefile=(*"Screen Shot"*(om[1]))
echo "Most recent screenshot is: $thefile"