No se puede actualizar la variable en el script bash

No se puede actualizar la variable en el script bash

Estoy intentando imprimir los nombres de todos los archivos .txt de la carpeta actual en una línea. Estoy usando el siguiente script. Sin embargo, no imprime nombres de archivos.

REF_SEQ=""
find . -name "*.txt" -maxdepth 1 -type f |
while read f;
do
    name=$(echo ${f}| xargs -I {} basename {} )
    REF_SEQ+="${name} "
done

echo "Full Sequence:  ${REF_SEQ}"

Tengo 3-4 archivos .txt en mi carpeta actual (A.txt, B.txt...). Estoy esperando resultados como

Secuencia completa: A.txt B.txt...

Si solo uso findel comando sin asignar salida a la variable RED_SEQ, obtengo el resultado deseado. Esto sugiere que el comando de búsqueda funciona bien pero de alguna manera no puedo asignarlo a una variable. Probé varios operadores de asignación diferentes pero todavía no tuve suerte.

Respuesta1

Para actualizar una variable en bash, debe utilizar esta sintaxis:

VAR="some stuff$VAR"

Pero, dado que está utilizando una tubería, el whilebucle se ejecuta en un sub-shell, su variable se pierde.

Para corregir esto, debes tener la sintaxis:

while read f
do
done <<< $(input)

Entonces en tu caso:

REF_SEQ=""

while read f;
do
    name=$(echo ${f}| xargs -I {} basename {} )
    REF_SEQ="${REF_SEQ}${name} "
done <<< $(find . -name "*.txt" -maxdepth 1 -type f)

echo "Full Sequence:  ${REF_SEQ}"

Respuesta2

El problema es que usas {} detrás del símbolo de tubería. Esto solo es válido en la opción -exec de buscar, pero no detrás del símbolo de tubería.

Podrías probar lo siguiente:

REF_SEQ=$(find . -max Depth 1 -name "*.txt" -type f -printf "%f " | xargs)

Esto debería producir el resultado que desea. La directiva printf %f genera el nombre base del archivo encontrado y xargs "transpone" el resultado.

Saludos cordiales Jürgen

información relacionada