#bash
#bash
Вопрос:
Я пытаюсь сохранить список файлов (фактически, файлы *.cpp) в переменную, так что список разделяется символами новой строки. То, что я придумал до сих пор, это:
VAR=''; for myfile in *.cpp; do VAR =$myfile$'n'; done
echo $VAR
Однако список файлов не содержит никаких символов новой строки, это всего лишь один пробел. На самом деле, обработка пробелов кажется полностью отключенной. Например, при вводе
VAR=''; for myfile in *.cpp; do VAR =$myfile$' o o '; done
echo $VAR
Все последовательности пробелов обрезаются до одного пробела. Ничего подобного не произойдет, если я немедленно отправлю строки через echo. Например,
echo $' heynthow are you?'
выглядит так, как и ожидалось.
Как он может получить желаемый список файлов в переменной?
Комментарии:
1. Проблема XY заключается в том, что вы спрашиваете о вашем предпринятом решении, а не о вашей реальной проблеме.
2. wrt
I am trying to save a list of files (actually, *.cpp files) into a variable
— крайне маловероятно, что это лучшая идея, чем сохранение списка в массив.3. @Cyrus Вы правы. Однако принятый ответ также научил меня кое-чему о переменных оболочки.
Ответ №1:
Однако список файлов не содержит новых строк, это всего лишь один пробел
Имеет значение false. Вы печатаете ее через пробелы, потому что расширение с разделением слов происходит при расширении переменной без кавычек в $VAR
, а ваше IFS
значение по умолчанию. Как правило, всегда заключайте расширения переменных в кавычки, т. е.. do "$VAR"
.
Как он может получить желаемый список файлов в переменной?
Ваш текущий метод «работает». В крайних случаях произойдет сбой, например. если *.cpp
файлов не существует, вы получите VAR="*.cpp"$'n'
. Также обратите внимание, что ваш метод добавляет завершающий символ новой строки в конце. Я предлагаю просто использовать find
:
VAR=$(find . -maxdepth 1 -type f -name '*.cpp')
Вы также могли бы сделать:
VAR=$(printf "%sn" *.cpp)
Чтобы устранить проблему отсутствия *.cpp
файлов, вы могли бы проверить, действительно ли файл существует:
for myfile in *.cpp; do
if [ -e "$myfile" ]; then VAR ="$myfile"$'n'; fi
done