Não é possível atualizar a variável no script bash

Não é possível atualizar a variável no script bash

Estou tentando imprimir os nomes de todos os arquivos .txt da pasta atual em uma linha. Estou usando o seguinte script. No entanto, não está imprimindo nomes de arquivos.

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}"

Tenho 3-4 arquivos .txt na minha pasta atual (A.txt, B.txt...). Estou esperando uma saída como

Sequência completa: A.txt B.txt ...

Se eu apenas usar findo comando sem atribuir a saída à variável RED_SEQ, obtenho a saída desejada. Isso sugere que o comando find está funcionando bem, mas de alguma forma não consigo atribuí-lo à variável. Tentei vários operadores de atribuição diferentes, mas ainda sem sorte.

Responder1

Para atualizar uma variável em bash, você deve usar esta sintaxe:

VAR="some stuff$VAR"

Mas, como você está usando um pipe, o whileloop é executado em um sub-shell, sua variável é perdida.

Para corrigir isso, você deve ter a sintaxe:

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

Então, no seu 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}"

Responder2

O problema é que você usa {} atrás do símbolo de barra vertical. Isso é válido apenas na opção -exec de find, mas não atrás do símbolo de barra vertical.

Você pode tentar o seguinte:

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

Isso deve produzir o resultado que você deseja. A diretiva printf %f exibe o nome base do arquivo encontrado e o xargs "transpõe" o resultado.

Atenciosamente Jürgen

informação relacionada