2016-03-03 4 views
1

Я видел статьи 'для' петля. Он разбивается на пробел пробела, как пространство, табуляция или новая строка. Для того, чтобы получить поездку по этому вопросу я следующая дополнительная строка команды:Чтение полной строки в цикле «для» с пробелами, вкладки с несколькими входными файлами

IFS=$'\n' 

Но когда я пытаюсь решить вышеприведенный сценарий на следующие детали (у меня есть два файла: «input1.txt» и 'input.txt' на моем текущем каталоге):

команда BASH:

bash script.sh 'input*' 

Ниже 'для' блока петли в script.sh

for line in $(cat $1) 
... 
... 
done; 

я получил следующую ошибку на выполнение:

cat: input1.txt input.txt*: No such file or directory 

Примечание: Я хочу кота оба файла input1.txt и input.txt

+1

Чтение из файлов: HTTP: //mywiki.wooledge .org/BashFAQ/001 –

+0

Это сообщение об ошибке не было создано командами в вашем сообщении. Пожалуйста, сделайте более точное описание проблемы. – rici

ответ

2

Переустанавливая $IFS, отключить софистика, что вызвало бы расширение образца в $1 следует рассматривать как отдельные имена файлов. Это еще одна причина сделать это направлением. Но сначала, допустим, вы действительно хотите передать шаблон вашему сценарию, а не просто использовать bash script.sh input*, чтобы оболочка расширила шаблон до списка файлов для вашего скрипта. Тогда ваша петля должна быть чем-то вроде

cat $1 | while IFS= read -r line; do 
    ... 
done 

Однако, это не будет работать, если какой-либо из соответствующих файлов сами имеют пробелы в своих названиях; с input a.txt и input b.txt, $1 расширится слов input, a.txt, input и b.txt. Вместо этого, вы должны действительно позволить сделать оболочке расширения и передать каждый файл сопоставления как отдельный аргумент:

bash script.sh input* 

и в сценарии:

for f in "[email protected]"; do 
    while IFS= read -r line; do 
     ... 
    done < "$f" 
done 
Смежные вопросы