bash - programas - script linux ejemplos
¿Cómo puedo eliminar la extensión de un nombre de archivo en un script de shell? (8)
Debería utilizar el comando Sintaxis de sustitución $(command) cuando desee ejecutar un comando en script / comando.
Entonces tu línea sería
name=$(echo "$filename" | cut -f 1 -d ''.'')
Explicación del código:
-
echoobtiene el valor de la variable$filenamey lo envía a la salida estándar - A continuación, tomamos la salida y la canalizamos al comando de
cut - El
cutusará el. como delimitador (también conocido como separador) para cortar la cuerda en segmentos y por-fseleccionamos qué segmento queremos tener en la salida - Entonces la sustitución del comando
$()obtendrá la salida y devolverá su valor - El valor devuelto se asignará a la variable llamada
name
Tenga en cuenta que esto da la porción de la variable hasta el primer período . :
$ filename=hello.world
$ echo "$filename" | cut -f 1 -d ''.''
hello
$ filename=hello.hello.hello
$ echo "$filename" | cut -f 1 -d ''.''
hello
$ filename=hello
$ echo "$filename" | cut -f 1 -d ''.''
hello
¿Qué pasa con el siguiente código?
name=''$filename | cut -f1 -d''.''''
Como es, obtengo la cadena literal $filename | cut -f1 -d''.'' $filename | cut -f1 -d''.'' , pero si elimino las citas, no obtengo nada. Mientras tanto, escribiendo
"test.exe" | cut -f1 -d''.''
en un shell me da la salida que quiero, test . Ya sé que $filename se le ha asignado el valor correcto. Lo que quiero hacer es asignar a una variable el nombre del archivo sin la extensión.
Dos problemas con tu código:
- Usó un ''(tick) en lugar de un `(back tick) para rodear los comandos que generan la cadena que desea almacenar en la variable.
- No hizo "eco" de la variable "$ filename" al conducto en el comando "cortar".
Cambiaría tu código a "name =` echo $ filename | cut -f 1 -d ''.'' `", como se muestra a continuación (de nuevo, observe las marcas de retroceso que rodean la definición de variable de nombre):
$> filename=foo.txt
$> echo $filename
foo.txt
$> name=`echo $filename | cut -f1 -d''.''`
$> echo $name
foo
$>
Si conoce la extensión, puede usar el basename
$ basename /home/jsmith/base.wiki .wiki
base
Si su nombre de archivo contiene un punto (que no sea el de la extensión), utilice esto:
echo $filename | rev | cut -f 2- -d ''.'' | rev
También puede usar la expansión de parámetros:
$ filename=foo.txt
$ echo "${filename%.*}"
foo
#!/bin/bash
filename=program.c
name=$(basename "$filename" .c)
echo "$name"
productos:
program
#!/bin/bash
file=/tmp/foo.bar.gz
echo $file ${file%.*}
productos:
/tmp/foo.bar.gz /tmp/foo.bar
Tenga en cuenta que solo se elimina la última extensión.
file1=/tmp/main.one.two.sh
t=$(basename "$file1") # output is main.one.two.sh
name=$(echo "$file1" | sed -e ''s//.[^.]*$//'') # output is /tmp/main.one.two
name=$(echo "$t" | sed -e ''s//.[^.]*$//'') # output is main.one.two
usa lo que quieras Aquí asumo eso último . (punto) seguido de texto es extensión.