2012-10-11 30 views
7

Estoy tratando de escribir una secuencia de comandos que toma el nombre básico de un argumento, luego verifica si hay una extensión en ese argumento. Si hay, imprime la extensión.Sintaxis del bash de Bash

Aquí está mi código:

file=basename $1 
ext=${file%*} 
echo ${file#"$stub"} 
echo $basename $1 

estoy haciendo eco de la final de $ nombre base de $ 1 a comprobar lo que la salida del nombre base es.

Algunas pruebas revelan:

testfile.sh one.two 
./testfile: line 2: one.two: command not found 
one.two 

testfile.sh ../tester 
./testfile: line 2: ../tester: No such file or directory 
../tester 

Así que ni nombre base $ $ 1 están trabajando. Sé que es un error de sintaxis, así que, ¿podría alguien explicar lo que estoy haciendo mal?

EDIT:

he resuelto mi problema ahora con:

file=$(basename "$1") 
stub=${file%.*} 
echo ${file#"$stub"} 

que reduce mi argumento a un nombre base, gracias a todos.

+0

La sintaxis correcta es file = $ (basename $ 1). Te recomendaría usar file = $ {1 ## * /}, que eliminará cada secuencia '* /'. En realidad, es mucho más rápido que el comando basename, especialmente al procesar archivos en un bucle. –

Respuesta

12

primer lugar, su sintaxis es incorrecta:

file=$(basename "$1") 

En segundo lugar, esta es la expresión correcta para obtener (última) la extensión del nombre de archivo:

ext=${file##*.} 
+0

Gracias por la primera parte, me doy cuenta de que ahora el archivo es igual a la salida del nombre base, por lo que ayuda.Ahora mi programa no funciona según lo previsto, lo que significa que está probando tester.two en lugar de .two si mi argumento inicial es tester.two. Antes de agregar basename, mi script funcionaba como debía, aparte de cuando probé .../tester, que no debería dar salida a nada. – Unknown

8

Si desea asignar a una variable el resultado de un comando, debe ejecutarlo, ya sea con comillas inversas o con un paréntesis especial:

file=`basename "$1"` 
file=$(basename "$1") 

Para eliminar la extensión de un nombre de archivo que debe hacer

ext=${file#*.} 

Esto hará que el valor de $file, a continuación, quitar todo lo que hasta el período (por eso es necesario). Si su nombre de archivo contiene puntos, entonces debe usar ext=${file##*.}, donde ## le dice a bash que elimine la cadena más larga que coincida en lugar de la más corta, por lo que se eliminará hasta el último período, en lugar del primero.

Su echo $basename $1 es extraño. Decir a bash que imprima el valor de una variable llamada $basename y el valor de la variable $1, que es el primer argumento del guión (o función).

Si desea imprimir el comando que está tratando de ejecutar, hacer esto:

echo basename $1 

Si usted está tratando de imprimir el resultado del comando, se puede hacer uno de:

echo $(basename "$1") 
echo "$file" 
basename "$1" 

Espero que esto ayude =)