2014-11-05 5 views
0

Я делаю простую итерацию по содержимому удаленного текстового файла, но застреваю в именах разделяемых файлов, поскольку у них есть пробелы внутри.Итерация по строкам содержит пробелы

#!/bin/bash 
for u in $(curl http://XXXXXX.com/urls.txt) 
do 
    wget "${u%|*}" -O "${u#*|}" -P ./Directory/ 
done 

Текстовый файл содержит ниже строк в каждой строке:

https://OOOOOOOO.com?url1|My file with spaces in name.mp4 
https://OOOOOOOO.com?url2|How to escape spaces?.mp4 
https://OOOOOOOO.com?url3|Mixed up.mp4 
https://OOOOOOOO.com?url4|Asking StackOverFlow!.mp4 

Я посмотрел на многих подобных вопросов уже сделано много подходов, но все результаты то же самое.

Когда я делаю echo ${u#*|} один, у меня есть выход:

My 
file 
with 
spaces 
in 
name.mp4 
Mixed 
up.mp4 
. 
. 
. 

Что случилось?

ответ

2

while-read петля будет проще здесь:

curl http://XXXXXX.com/urls.txt | 
while IFS='|' read -r url filename; do 
    wget "${url}" -O "${filename}" -P ./Directory/ 
done 
1

использование Input Field Separator (IFS)

Эта переменная определяет, как Bash распознает поля или слова границы, когда он интерпретирует строки символов. LINK

например:

IFS=$'\n' 
for u in $(cat file) 
do 
    echo ${u#*|} 
done 

ВЫВОД:

My file with spaces in name.mp4 
How to escape spaces?.mp4 
Mixed up.mp4 
Asking StackOverFlow!.mp4 
+0

Спасибо! Раньше я использовал 'IFS' для новых строк, но расщепление было выполнено с помощью' read', а не с этими оболочками globs! Не могли бы вы сказать, что случилось с моим? и что такое '' 'после' IFS = '? – revo

+1

@revo: прочитайте это: http://stackoverflow.com/questions/4128235/bash-shell-scripting-what-is-the-exact-meaning-of-ifs-n –

+2

Не связывайтесь с IFS при чтении , Просто сделайте 'while read -d '|' url fname; делай что угодно; done <$ filename' Это сохранит первую часть в 'url', а вторую - в' fname'. Просто укажите «$ fname», когда вы его используете. –

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