bash скрипт и файлы и с пробелами

Linux unix bash

Подскажите, пожалуйста. Вот пишу такой скрипт:

#!/bin/sh
for i in /home/digital7/immobiclub.ru/docs/images/com_jea/images/*;
do
if [ -f `echo $i`/main.jpg ] ## Есть main.jpg
then echo > /dev/null
else # Нет main.jpg
if [ -d `echo $i`/secondary/ ] # Каталог /secondary есть
then
a=$(ls `echo $i`/secondary/*.jpg 2> /dev/null| head -n 1|sed 's/ /\\ /g') # выбираем первый попавшийся файл в secondary, выделяем антислешами пробелы
if [ -z "$a" ] # Там нет файлов
then
else # Там есть хотя бы один файл
ln `echo $a` $i/main.jpg # Делаем символическую ссылку
convert -resize 190 $i/main.jpg $i/min.jpg
convert -resize 400 $i/main.jpg $i/preview.jpg
fi
else # Каталога /secondary нету
mkdir `echo $i`/secondary # Создаем его
./resize.sh # Проходим повторно
fi
fi;
done#!/bin/sh
for i in /home/digital7/immobiclub.ru/docs/images/com_jea/images/*;
do
if [ -f `echo $i`/main.jpg ] ## Есть main.jpg
then echo > /dev/null
else # Нет main.jpg
if [ -d `echo $i`/secondary/ ] # Каталог /secondary есть
then
a=$(ls `echo $i`/secondary/*.jpg 2> /dev/null| head -n 1|sed 's/ /\\ /g') # выбираем первый попавшийся файл в secondary
if [ -z "$a" ] # Там нет файлов
then
else # Там есть хотя бы один файл
ln -s `echo $a` $i/main.jpg # Делаем символическую ссылку
convert -resize 190 $i/main.jpg $i/min.jpg
convert -resize 400 $i/main.jpg $i/preview.jpg
fi
else # Каталога /secondary нету
mkdir `echo $i`/secondary # Создаем его
./resize.sh # Проходим повторно, знаю - некошерно, но с функциями не было времени разбираться
fi
fi;
done
</lj-cut>

если натыкается на файл с пробелами, то немедленно спотыкается с такой ошибкой:
ln: путь/images/com_jea/images/1858/main.jpg: No such file or directory
Если перед ln ставлю echo, а потом ее вывод запускаю в консольке, то команда выполняется нормально.
В чем может быть дело? Спасибо. Гуглил долго.
Ответы:
Кавычками закройте.
Хотя бы так:
a1=$i/main.jpg
ln -s "$a" "$a1"
#!/bin/sh
IFS=$'\n'         # По умолчанию делитель &amp;quot;пробел&amp;quot; ... изменяем его на &amp;quot;перенос строки&amp;quot;
сразу после перебора желательно сбросить IFS
unset IFS
на случай если далее понадобится стандартное поведение
Mike Krotoff, достаточно заключить в блок код {...} и тогда локальны изменения данной переменной будут ...
а по завершению скрипта так и так в исходную вернется =)


15 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.