Скрипт Bash, который создает переменную со списком файлов, разделенных символами новой строки

#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