¿Sustitución de expansión de llaves?

¿Sustitución de expansión de llaves?

Creé un pequeño script bash para dividir automáticamente mis dos monitores con imagemagick cuando tomo una captura de pantalla.

#! /bin/bash
convert "$1" -crop 1024x600+0+0 +repage "${1//.png/}-left.png"
convert "$1" -crop 1280x1024+1024+0 +repage "${1//.png/}-right.png"

Esto funciona muy bien, pero solo le cambiará el nombre correctamente si es png (lo cual en este caso no es un problema). ¿Hay alguna forma de hacerlo funcionar para mover la extensión del archivo al final? Entonces, si llamo a este script (llamémoslo splitimage) en un archivo, oldscreenshot.jpgme daría oldscreenshot-left.jpgy oldscreenshot-right.jpg?

Respuesta1

Sí, usando las expansiones ${param##word}y ${param%word}. El primero se deshará de la extensión, el último se deshará de todo.perola extensión

#! /bin/bash

convert "$1" -crop 1024x600+0+0 +repage "${1%.*}-left.${1##*.}"
convert "$1" -crop 1280x1024+1024+0 +repage "${1%.*}-right.${1##*.}"

Ejemplo

$ var=foo.jpg; echo "No extention: ${var%.*} | Extention only: ${var##*.}"
No extention: foo | Extention only: jpg

Respuesta2

Sí. Pero usa stripping en tuexpansión de parámetros(noexpansión de llaves, eso es algo completamente diferente) en lugar de reemplazo.

convert "$1" -crop 1024x600+0+0 +repage "${1%.*}-left.${1##*.}"

información relacionada