подскажите, пожалуйста, что я делаю не так:#!/bin/sh
$TMPFILE="log.txt"
cat ./$TMPFILE | sed -e "s|[^/]*/||g" |
while read text;do
mv $text $ENGINEDIR
doneрезультатом вываливаются ошибки о не существовании файлов...
перед mv $text $ENGINEDIR ставил echo "$text $ENGINEDIR" дабы убедиться в наличии дааных в переменных... выдавало только вторую($ENGINEDIR).
так же пробовал ставить (все там же, перед mv $text $ENGINEDIR)
echo "$text"
echo "$ENGINEDIR"выдает содержимое нормально...
и сам вопрос: как правильно прописать 2 переменные в одной строке?
>подскажите, пожалуйста, что я делаю не так:
>
>#!/bin/sh
>$TMPFILE="log.txt"
>cat ./$TMPFILE | sed -e "s|[^/]*/||g" |
>while read text;do
> mv $text $ENGINEDIR
>doneВозможно, что у вас после обработки sed'ом в некоторых случаях остаётся пустая строка?
Тогда можно сделать так:
-mv $text $ENGINEDIR
+if [ -n "$text" ]; then
+ mv "$text" "$ENGINEDIR"
+fi
>-mv $text $ENGINEDIR
>+if [ -n "$text" ]; then
>+ mv "$text" "$ENGINEDIR"
>+fiне помогает... дело в том, что если в цикле вставить
echo $text
на выводе пустых строк нету
>на выводе пустых строк нетуПокажите содержимое файла log.txt
>Покажите содержимое файла log.txt/eval/engine/engine0.nup
/eval/engine/engine1.nup
/eval/engine/engine2.nup
>подскажите, пожалуйста, что я делаю не так:
>
>#!/bin/sh
>$TMPFILE="log.txt"
>cat ./$TMPFILE | sed -e "s|[^/]*/||g" |
>while read text;do
> mv $text $ENGINEDIR
>done
>
>результатом вываливаются ошибки о не существовании файлов...Короче, ясно.
В файле полные пути к файлам. Вы же их обрезаете и конечно же оказывается, что файлы не найдены, потому что они в другом каталоге.
Попробуйте так:
while read text;do
mv "$text" $ENGINEDIR"
done < "$TMPFILE"
не помогает... Вопрос не совсем в том, почему файлы не найдены, а в том, почему
echo "$text $ENGINEDIR"
выводит только вторую переменную... , а
mv $text $ENGINEDIR
выдает, что не найдены файлы, причем светит последние несколько символов от имени...
т.е.:
: No such file or directoryupe0.nup
: No such file or directoryupe1.nup
: No such file or directoryupe2.nup
>выдает, что не найдены файлы, причем светит последние несколько символов от имени...Мне кажется, что ваш пример упрощен и в реальности данные/скрипт несколько другие...
Между отображением имени файла и его получением из файла на $text может влиять только sed. Возможно, он как-то не так обрабатывает ваши строчки.
sh -x вам в помощь!
На самом деле скрипт очень большой... но не работает именно этот цикл...while read text;do
mv "$text" "$ENGINEDIR"
echo "$text"
echo "$ENGINEDIR"
echo "$text $ENGINEDIR"
doneПолный вывод получается таким:
: No such file or directoryup <== почему здесь не полностью указано имя?
engine0.nup
/var/www/data/
/var/www/data/ <== почему не пишет имя файла?
: No such file or directoryup
engine1.nup
/var/www/data/
/var/www/data/
: No such file or directoryup
engine2.nup
/var/www/data/
/var/www/data/почему он не пишет имя файла?
>На самом деле скрипт очень большой... но не работает именно этот цикл...
>
>
>while read text;do
> mv "$text" "$ENGINEDIR"
> echo "$text"
> echo "$ENGINEDIR"
> echo "$text $ENGINEDIR"
> done
>Проверьте так:
while read text;do
echo mv $text $ENGINEDIR
done>[оверквотинг удален]
>: No such file or directoryup
>engine1.nup
>/var/www/data/
> /var/www/data/
>: No such file or directoryup
>engine2.nup
>/var/www/data/
> /var/www/data/
>
>почему он не пишет имя файла?Что-то многовато полного вывода для всего трех echo. Варианты:
- в $text оказывается несколько строк
- в $text попадает сообщение об ошибке по какой-то причинеТрудно сказать наверняка не видя код.
P.S. Опять же напоминаю про sh -x: добавьте перед циклом set -x, а после set +x и посмотрите что будет выводить.
>[оверквотинг удален]
>в том, почему
>echo "$text $ENGINEDIR"
>выводит только вторую переменную... , а
>mv $text $ENGINEDIR
>выдает, что не найдены файлы, причем светит последние несколько символов от имени...
>
>т.е.:
>: No such file or directoryupe0.nup
>: No such file or directoryupe1.nup
>: No such file or directoryupe2.nupЕсть подозрение, что исходный файл имеет DOS-овский форимат конца строки, т.е. \r\n.
Просто надо убрать эти лишние '\r', например sed 's/\r//'
Приведённый Вами скрипт, если в нём заменить
$TMPFILE="log.txt"
на
TMPFILE="log.txt"
и определить переменную ENGINEDIR, работает нормально (хотя я бы использовал здесь basename вместо sed).Всякие ковычки вокруг "$text" и т.п. актуальны, если в путях могут быть пробельные символы.