#!/bin/bash FILE="$(basename "$1")" FILE="${FILE/%.jpeg/.jpg}"
¿Existe alguna forma de pegar estas dos líneas en una sola línea?
Respuesta
FILE=$(basename "${1/%.jpeg/.jpg}")
funcionó para mí.
prueba:
bash-$ ./test.sh /tmp/foo.jpeg foo.jpg
contenido del script:
bash-$ cat test.sh #!/usr/bin/bash FILE=$(basename "${1/%.jpeg/.jpg}") echo "$FILE"
Comentarios
Respuesta
No puedes anidar expansiones en bash (ni en ksh, ash y otros shells aparte de zsh). Esto es solo una limitación cosmética, ya que como ilustras puedes asignar una expresión intermedia a una variable temporal. Es un poco molesto para las frases breves, pero en los scripts es posiblemente mejor para la legibilidad.
Podrías evitar u cante la utilidad externa basename
y use una construcción de manipulación de cadenas en su lugar:
FILE="${1##*/}"; FILE="${FILE/%.jpeg/.jpg}"
Aquí, sucede que puede reescribe tu secuencia de comandos para coloca la sustitución del comando en el exterior . Eso no es un fenómeno general, ni obtienes nada más que una cierta sensación de una sola línea.
Zsh, para bien o para mal, te permite anidar expansiones:
FILE=${$(basename $1)/%.jpeg/.jpg} # using basename FILE=${${1##*/}/%.jpeg/.jpg} # using string rewriting
O puede usar la construcción incorporada de zsh «en lugar de basename
:
FILE=${${1:t}/%.jpeg/.jpg}
Respuesta
Yo «iría por:
FILE=$(basename $1 .jpeg).jpg
El segundo parámetro del nombre base es un sufijo que se eliminará del nombre del archivo (consulte man basename
)
Respuesta
Puede usar un solo comando sed
como se muestra a continuación:
FILE=$(sed "s/.*\///;s/\.jpeg$/.jpg/" <<<"$1")
Respuesta
Incorporando sed
, esto debería funcionar:
FILE="$(basename "$1" | sed s/\.jpeg$/.jpg/)"
(Esto no responde exactamente a su pregunta porque no puedo; no estoy seguro de si es posible).
Responder
The Bash funcionan con nombres de variables , por lo que no hay forma de incrustar un comando directamente. El enfoque de @sr_ es una alternativa si no le importa la bifurcación adicional.
Respuesta
La línea
FILE=$(basename "${1/%.jpeg/.jpg}")
se puede acortar y hacer más portátil con
FILE=$(basename "${1%.jpeg}.jpg")
sed
definitivamente será necesario, supongo.