Necesito concatenar dos variables para crear un nombre de archivo que tenga un guión bajo. Llamemos a mis variables $FILENAME
y $EXTENSION
dónde se lee el nombre de archivo de un archivo.
FILENAME=Hello
EXTENSION=WORLD.txt
Ahora...
He intentado lo siguiente sin éxito:
NAME=${FILENAME}_$EXTENSION
NAME=${FILENAME}'_'$EXTENSION
NAME=$FILENAME\\_$EXTENSION
Siempre obtengo algún tipo de salida extraña. Por lo general, el guión bajo primero.
Necesito que sea
echo $NAME
Hello_WORLD.txt
bash
shell-script
Rhyuk
fuente
fuente
Respuestas:
Puedes usar algo como esto:
Esto también funciona:
fuente
echo
no puede ayudar. El segundo comando ya fue dado en la pregunta.Tu:
están todos bien, así sería:
(pero ciertamente no
como lo usaNAME=$(echo ${FILENAME}_${EXTENSION})
echo
y elsplit+glob
operador ).habría sido lo mismo que:
como
_
(contrario a\
o'
) es un carácter válido en un nombre de variable.Su problema es que tenía líneas delimitadas con CRLF en lugar de solo LF, lo que significaba que ese contenido variable terminaba en caracteres CR.
El carácter CR, cuando se escribe en un terminal, le dice al terminal que mueva el cursor al comienzo de la línea. Entonces,
Hello<CR>_WORLD.TXT<CR>
cuando se envía a una terminal, se mostrará como_WORLD.TXT
(anulando elHello
).fuente
He cambiado a usar la
${FILENAME}_${EXTENSION}
sintaxis mencionada anteriormente.Solía usar
$()
cuando necesitaba concatenar dos variables con un guión bajo. Por ejemplo,$YYYYMMDD$()_$HHMMSS
para generar un nombre de archivo que contenga una marca de tiempo en el formato AAAAMMDD_HHMMSS. El medio$()
no devuelve nada y separa las dos variables.Solía
time
medir las asignaciones usando el$YYYYMMDD$()_$HHMMSS
método y algunas de las anteriores, y todas han reportado 0 ms en el servidor anterior en el que estoy usando esto. El rendimiento no parece ser un problema.fuente
$()
bifurca un subshell en unos pocos shells (algunos lo optimizan). También está secuestrando a un operador para algo para lo que no ha sido diseñado.${x}_y
es lo que quieresDebe usar variables en minúsculas (es la mejor práctica).
Por lo tanto, usaré el nombre de archivo y la extensión en lugar de FILENAME y EXTENSION
Cuando diga que "el nombre de archivo se lee de un archivo", supondré que el script es:
Y que desea concatenar ambas variables $ filename y $ extension con un guión bajo
_
.Los ejemplos que proporciona (excepto: no double \) funcionan correctamente aquí:
Como algunos otros:
Por lo tanto, su problema no es cómo se unen las variables, sino con el contenido de los vars. Parece razonable pensar que esto:
leerá un retorno de carro final
\r
si lee desde un archivo de Windows.Una solución simple (para ksh, bash, zsh) es eliminar todos los caracteres de control de la variable de lectura:
Esto podría simularse con un valor que tenga un retorno de carro:
O, reemplazando el valor de
filename
:Conclusión.
Así que esto:
Obtendrá el valor correcto
name
incluso si los otros vars contienen caracteres de control.fuente
La respuesta de Stéphane Chazelas ,
es, por supuesto, la mejor respuesta, y debería ser la respuesta aceptada. Pero, en el espíritu de la respuesta del usuario 208145 , aquí hay una alternativa:
fuente
También puede usar esto: separe los vars separados con espacios y concatenelos usando tr para eliminar el espacio.
fuente