Невозможно обновить переменную в скрипте bash

Невозможно обновить переменную в скрипте bash

Я пытаюсь напечатать имена всех .txt файлов из текущей папки в одну строку. Я использую следующий скрипт. Однако он не печатает имена файлов.

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

У меня в текущей папке есть 3-4 файла .txt (A.txt, B.txt ...). Я ожидаю вывод в виде

Полная последовательность: A.txt B.txt ...

Если я просто использую findкоманду, не присваивая вывод переменной RED_SEQ, я получаю желаемый вывод. Это говорит о том, что команда find работает нормально, но я не могу присвоить ее переменной. Я пробовал разные операторы присваивания, но все равно безуспешно.

решение1

Чтобы обновить переменную в bash, необходимо использовать следующий синтаксис:

VAR="some stuff$VAR"

Но поскольку вы используете канал, whileцикл выполняется в подоболочке, ваша переменная теряется.

Чтобы исправить это, вам необходимо иметь следующий синтаксис:

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

Итак, в вашем случае:

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

решение2

Проблема в том, что вы используете {} после символа вертикальной черты. Это допустимо только в опции -exec команды find, но не после символа вертикальной черты.

Вы можете попробовать следующее:

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

Это должно дать желаемый результат. Директива printf %f выводит базовое имя найденного файла, а xargs «транспонирует» результат.

С наилучшими пожеланиями Юрген

Связанный контент