función bash: dividir el nombre y la extensión de un archivo

función bash: dividir el nombre y la extensión de un archivo

Tengo la siguiente función spliten mi archivo .bash_profile.

function split {
   name="${$1%.*}"
   ext="${$1##*.}"
   echo filename=$name extension=$ext
}

Ahora debo esperar que el comando split foo.barme dé

filename=foo  extension=bar

Pero recibo -bash: ${$1%.*}: bad substitutionun mensaje de error. Sin embargo, lo mismo funciona para la variable de shell habitual en un script de shell, digamos $xen lugar de $1en .bash_profile (creo que lo mismo ocurre también en .bashrc).

¿Qué pasa y algún remedio?

Respuesta1

Suelte el $nombre de la variable anterior ( 1) dentro de la expansión del parámetro:

name="${1%.*}"
ext="${1##*.}"

Ya te estás refiriendo a la variable con la $llave inicial anterior {, no es necesario poner otra delante del nombre de la variable.

Respuesta2

Si tiene los dirnamecomandos basenamey awk, es posible que desee considerar esta definición de función

function split {

DIR=$(/bin/dirname "$1")
BASE=$(/bin/basename "$1")
EXT=$(echo "$BASE" | /usr/bin/awk -F. 'NF>1 {print $NF}')
NAME=${BASE%.$EXT}
echo directory=$DIR filename=$NAME extension=$EXT

}

split good.bye/data.txt
split good.bye/data
split data.txt
split good.bye/data.001.txt
split "good bye/data 001.txt"

información relacionada