Una asignación de shell es una sola palabra, sin espacio después del signo igual. Entonces, lo que escribió le asigna un valor vacío thefile
; Además, dado que la asignación se agrupa con un comando, convierte thefile
una variable de entorno y la asignación es local para ese comando en particular, es decir, solo la llamada para ls
ver el valor asignado.
Desea capturar la salida de un comando, por lo que debe usar la sustitución de comandos :
thefile=$(ls -t -U | grep -m 1 "Screen Shot")
(Parte de la literatura muestra una sintaxis alternativa thefile=`ls …`
; la sintaxis de las comillas inversas es equivalente a la sintaxis entre paréntesis en dólares, excepto que a veces es raro citar dentro de las comillas inversas, así que solo úselo $(…)
).
Otras observaciones sobre su script:
- Combinar
-t
(ordenar por tiempo) con -U
(no ordenar) no tiene sentido; solo usa -t
.
En lugar de usar grep
para hacer coincidir las capturas de pantalla, es más claro pasar un comodín ls
y usar head
para capturar el primer archivo:
thefile=$(ls -t *"Screen Shot"* | head -n 1)
Generalmente es una mala idea analizar la salida dels
. Esto podría fallar bastante si tiene nombres de archivo con caracteres no imprimibles. Sin embargo, ordenar archivos por fecha es difícil sin ellos ls
, por lo que es una solución aceptable si sabe que no tendrá caracteres no imprimibles o barras invertidas en los nombres de archivo.
Siempre use comillas dobles alrededor de sustituciones variables , es decir, aquí escriba
echo "Most recent screenshot is: $thefile"
Sin comillas dobles, el valor de la variable se vuelve a ampliar, lo que causará problemas si contiene espacios en blanco u otros caracteres especiales.
- No necesita punto y coma al final de una línea. Son redundantes pero inofensivos.
- En un script de shell, a menudo es una buena idea incluirlo
set -e
. Esto le dice al shell que salga si falla algún comando (al devolver un estado distinto de cero).
Si tiene GNU find (en particular si está ejecutando Linux o Cygwin no incrustado), hay otro enfoque para encontrar el archivo más reciente: haga una find
lista de los archivos y sus fechas, y use sort
y tail
para extraer el archivo más joven.
thefile=$(find -maxdepth 1 -type f -name "*Screen Shot*" -printf "%T@ %p" |
sort -k 1n | tail -n 1)
Si está dispuesto a escribir este script en zsh en lugar de bash, hay una manera mucho más fácil de capturar el archivo más nuevo, porque zsh tiene calificadores globales que permiten coincidencias con comodines no solo en los nombres sino también en los metadatos del archivo. La (om[1])
parte que sigue al patrón son los calificadores glob; om
clasifica las coincidencias al aumentar la edad (es decir, por el tiempo de modificación, la más nueva primero) y [1]
extrae solo la primera coincidencia. Toda la coincidencia debe estar entre paréntesis porque técnicamente es una matriz, ya que el globbing devuelve una lista de archivos, incluso si [1]
eso significa que en este caso particular la lista contiene (como máximo) un archivo.
#!/bin/zsh
set -e
cd ~/Desktop
thefile=(*"Screen Shot"*(om[1]))
echo "Most recent screenshot is: $thefile"