
У меня есть файл Files.txt
со следующим содержимым:
TestApp/Resources/Supporting Files/main.m
TestApp/Resources/Supporting Files/AppDelegate.h
TestApp/Resources/Supporting Files/AppDelegate.m
Я извлекаю имена файлов и каталогов следующим образом и передаю их другому процессу.
files=$(cat Files.txt)
for item in $files ; do
dn=$(dirname $item)
printf $item
printf "\n"
printf $dn
printf "\n\n"
# passing to another process
done
Однако это приводит меня к следующему:
TestApp/Resources/Supporting
TestApp/Resources
Files/main.m
Files
TestApp/Resources/Supporting
TestApp/Resources
Files/AppDelegate.h
Files
TestApp/Resources/Supporting
TestApp/Resources
Files/AppDelegate.m
Files
Мне нужно вот это:
TestApp/Resources/Supporting Files/main.m
TestApp/Resources/Supporting Files
TestApp/Resources/Supporting Files/AppDelegate.h
TestApp/Resources/Supporting Files
TestApp/Resources/Supporting Files/AppDelegate.m
TestApp/Resources/Supporting Files
Я попробовал добавить префикс пробела \
in следующим Files.txt
образом:
TestApp/Resources/Supporting\ Files/main.m
и с %20
как:
TestApp/Resources/Supporting%20Files/main.m
безуспешно!
решение1
for
циклы повторяютсясловане линии- всегда цитируйте свои
"$variables"
(если только вы точно не знаете, когда этого делать не следует)
while read -r item ; do
dn=$(dirname "$item")
printf "%s\n" "$item"
printf "%s\n" "$dn"
# pass "$item" and "$dn" to another process
done < Files.txt
решение2
Вам необходимо установить разделитель полей:
OIFS=$IFS
IFS=$'\n'
files=$(cat Files.txt)
for item in $files ; do
dn=$(dirname $item)
printf $item
printf "\n"
printf $dn
printf "\n\n"
# passing to another process
done
IFS=$OIFS
Выход:
[me@localhost test]$ ./test.sh
TestApp/Resources/Supporting Files/main.m
TestApp/Resources/Supporting Files
TestApp/Resources/Supporting Files/AppDelegate.h
TestApp/Resources/Supporting Files
TestApp/Resources/Supporting Files/AppDelegate.m
TestApp/Resources/Supporting Files
Объяснение: http://en.wikipedia.org/wiki/Внутренний_разделитель_полей
Переменная $IFS
определяет, как ввод разделяется на токены, и по умолчанию это пробел, табуляция и новая строка. Поскольку вы хотите разделить только по новым строкам, переменную $IFS
нужно временно изменить.