Невозможно обновить переменную в скрипте 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 работает нормально, но я не могу присвоить ее переменной. Я пробовал разные операторы присваивания, но все равно не повезло.

2
задан 4 June 2019 в 17:17

2 ответа

Чтобы обновить переменную в 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}"
1
ответ дан 4 June 2019 в 17:17

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

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

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

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

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

0
ответ дан 4 June 2019 в 17:17

Другие вопросы по тегам:

Похожие вопросы: