2013-07-31 4 views
3

У меня есть текстовый файл со списком Mercurial хранилищ в нем, в виде:Bash конкатенация строки неправомерного

IDE 
Install 
InstallShield 

Я пишу Баш скрипт для клонирования/тянуть/обновить все репозитории на основе текстовый файл. Прямо сейчас я просто эхо, прежде чем я делаю фактическое клонирование. Если я:

while read line; do 
    echo "hg clone" ${MASTER_HG}/${line}; 
done < Repos.txt 

Выход, как и ожидалось:

hg clone /media/fs02/IDE 
hg clone /media/fs02/Install 
hg clone /media/fs02/InstallShield 

Однако, если я:

while read line; do 
    echo "hg clone" ${MASTER_HG}/${line} ${REPOROOT}/${line}; 
done < Repos.txt 

Выход:

/var/hg/repos/IDE02/IDE 
/var/hg/repos/Installnstall 
/var/hg/repos/InstallShieldShield 

кажется заменить начало строки на конец Струна. Есть ли какие-то переполнения характера или что-то происходит? Мои извинения, если это глупый вопрос, но я отношусь к noob для bash.

+2

Перевозки возвращаются? Окончания CRLF в Repos.txt? –

+4

CRLF - это новый квадратный корень всего зла. – devnull

+1

+1 для «относительного нуба» с некоторым фактическим кодом. – devnull

ответ

6

У вашего файла есть окончания строки DOS; \r в конце $line заставляет курсор возвращаться к началу строки, что влияет только на ваш вывод, когда $line не является последним, что печатается перед новой строкой. Вы должны удалить их с чем-то вроде dos2unix.


Вы можете использовать что-то похожее на chomp команды Perl, чтобы удалить косую возврата каретки, если один присутствует:

# $'\r' is bash-only, but easy to type. For POSIX shell, you'll need to find 
# someway of entering ASCII character 13; perhaps Control-V Control-M 
line=${line%$'\r'} 

Полезно, если по какой-либо причине, вы не можете (или Дон» t хотите) исправить ввод перед его чтением.

+1

Хорошее горе. Ты прав. Спасибо! Я должен был заметить флаг dos внизу моего редактора. Мне стыдно говорить, как долго это меня задевало. –

+1

@ChrisBush Я уверен, что это случилось со всеми нами хотя бы один раз. – SethMMorton

1

С его внешностью ${REPOROOT} может уже включать ${line}, попробуйте эхом ${REPOROOT} сам по себе и посмотрите, что вы получаете.

+0

Спасибо за ответ. Оказалось, что возврат каретки DOS-esque, как предложил чепнер. –

+1

А теперь я вижу. Я написал свой ответ до того, как вы отредактировали форматирование, поэтому я не заметил, что некоторые из символов отсутствовали, а не просто повторили значение '$ {line}' value ... capital i = I! = L = нижний регистр L – CDspace

+0

Это была моя вина. Спасибо Рубен за то, что он выделил результат. –