2013-04-30 3 views
1

я был дан совет, чтобы использовать file globbing вместо логинсервера в скриптах Bash, в моем коде я следовал инструкциям и заменить array=($(ls)) на:Bash заменить Ls с цикл

function list_files() { for f in *; do [[ -e $f ]] || continue done } 
array=($(list_files)) 

Однако новая функция DOEN» t возвращай что-нибудь, я делаю что-то не так здесь?

+0

'$ (function)' заменяется на то, что функция выводит на stdout. Ваша функция ничего не печатает. – Barmar

+1

Как только вы исправите это, оно не решит вашу проблему. Разбор вывода функции 'list_files' имеет ту же проблему, что и анализ вывода' ls'. Если имя файла содержит пробелы, оно будет считаться двумя именами при назначении массиву. Вам нужно сделать все, что угодно, внутри цикла 'for'. В примере на этой странице есть «...», в котором вы делаете то, что хотите, с каждым файлом. – Barmar

+0

ОК, поэтому проблема выше в том, что тест работает, но на самом деле он ничего не делает. Он просто видит, что файлы существуют, а затем тихо перемещается. Если вы положили echo $f до теста [[ -e $f ]], он проверяет обнаруженные файлы. Однако это не работает так, как мне нужно, чтобы работать, когда в коде передается эхо-оператор; Скрипт перекликается с файлами, а затем заполняет массив, который снова повторяет те же файлы ... Когда я удаляю оператор эха, массив не заполняется и ничего не выводится из сети. Есть ли способ передать файлы в цикле for в переменную или –

ответ

3

Просто напишите это:

array=(*) 

Оставляя в стороне, что ваш «list_files» не выводит ничего, есть еще и другие проблемы, связанные с вашим подходом.

Подстановочная замена без кавычек (в вашем случае «$ (list_files)») по-прежнему будет подвергаться «разбиению слов» и «расширению пути» (см. Bash (1) «EXPANSION»), что означает, что если есть пробелы в выводе «list_files» они будут использоваться для разделения его на элементы массива, и если будут символы шаблонов, они будут использоваться для попытки сопоставления и замены имен файлов текущего каталога в виде отдельных элементов массива.

OTOH, если вы приводите замену команды двойными кавычками, то весь вывод будет считаться одним элементом массива.

+0

Спасибо, что сделал трюк !! –

Смежные вопросы