Quiero asignar el resultado de una expresión a una variable y concatenarlo con una cadena, luego repetirlo. Esto es lo que tengo:
#!/bin/bash
cd ~/Desktop;
thefile= ls -t -U | grep -m 1 "Screen Shot";
echo "Most recent screenshot is: "$thefile;
Pero eso produce:
Screen Shot 2011-07-03 at 1.55.43 PM.png
Most recent screenshot is:
Entonces, parece que eso no se está asignando $thefile
y se está imprimiendo mientras se ejecuta.
Respuestas:
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, conviertethefile
una variable de entorno y la asignación es local para ese comando en particular, es decir, solo la llamada parals
ver el valor asignado.Desea capturar la salida de un comando, por lo que debe usar la sustitución de comandos :
(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:
-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ínls
y usarhead
para capturar el primer archivo:Generalmente es una mala idea analizar la salida de
ls
. Esto podría fallar bastante si tiene nombres de archivo con caracteres no imprimibles. Sin embargo, ordenar archivos por fecha es difícil sin ellosls
, 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
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.
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 usesort
ytail
para extraer el archivo más joven.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.fuente
Si desea hacerlo con comandos / s multilínea / múltiples, puede hacerlo:
O:
Ejemplo:
Salida:
fuente
output=$(echo $someVariable)