Un'assegnazione di shell è una singola parola, senza spazio dopo il segno di uguale. Quindi ciò che hai scritto assegna un valore vuoto a thefile
; inoltre, poiché l'assegnazione è raggruppata con un comando, crea thefile
una variabile d'ambiente e l'assegnazione è locale per quel particolare comando, ovvero solo la chiamata a ls
vedere il valore assegnato.
Desideri acquisire l'output di un comando, quindi devi utilizzare la sostituzione dei comandi :
thefile=$(ls -t -U | grep -m 1 "Screen Shot")
(Alcune pubblicazioni mostrano una sintassi alternativa thefile=`ls …`
; la sintassi del backquote è equivalente alla sintassi tra parentesi in dollari tranne per il fatto che la citazione all'interno di backquotes è strana a volte, quindi basta usare $(…)
.)
Altre osservazioni sulla tua sceneggiatura:
- Combinare
-t
(ordina per tempo) con -U
(non ordinare) non ha senso; basta usare -t
.
Invece di utilizzare grep
per abbinare gli screenshot, è più chiaro passare un carattere jolly ls
e utilizzare head
per acquisire il primo file:
thefile=$(ls -t *"Screen Shot"* | head -n 1)
È generalmente una cattiva idea analizzare l'output dils
. Questo potrebbe non riuscire abbastanza se si hanno nomi di file con caratteri non stampabili. Tuttavia, ordinare i file per data è difficile senza ls
, quindi è una soluzione accettabile se sai che non avrai caratteri non stampabili o barre rovesciate nei nomi dei file.
Usa sempre le virgolette doppie attorno alle sostituzioni variabili , ovvero qui scrivi
echo "Most recent screenshot is: $thefile"
Senza virgolette doppie, il valore della variabile viene espanso, il che causerà problemi se contiene spazi bianchi o altri caratteri speciali.
- Non hai bisogno di punti e virgola alla fine di una riga. Sono ridondanti ma innocui.
- In uno script di shell, è spesso una buona idea includere
set -e
. Questo dice alla shell di uscire se un comando fallisce (restituendo uno stato diverso da zero).
Se hai GNU find (in particolare se stai utilizzando Linux o Cygwin non embedded), c'è un altro approccio per trovare il file più recente: find
elenca i file e le loro date, usa sort
e tail
per estrarre il file più giovane.
thefile=$(find -maxdepth 1 -type f -name "*Screen Shot*" -printf "%T@ %p" |
sort -k 1n | tail -n 1)
Se sei disposto a scrivere questo script in zsh anziché in bash, c'è un modo molto più semplice per catturare il file più recente, perché zsh ha i qualificatori glob che consentono le corrispondenze con caratteri jolly non solo sui nomi ma anche sui metadati dei file. La (om[1])
parte dopo il modello sono le qualificazioni glob; om
ordina le partite aumentando l'età (ovvero in base al tempo di modifica, prima il più recente) ed [1]
estrae solo la prima corrispondenza. L'intera corrispondenza deve essere racchiusa tra parentesi perché è tecnicamente un array, poiché il globbing restituisce un elenco di file, anche se [1]
ciò significa che in questo caso particolare l'elenco contiene (al massimo) un file.
#!/bin/zsh
set -e
cd ~/Desktop
thefile=(*"Screen Shot"*(om[1]))
echo "Most recent screenshot is: $thefile"