LINUX.ORG.RU

Бесконечная проверка существования папки


0

1

Необходимо сделать следующее: 1) пользователь вводит полный путь к папке; 2) проверяется существование папки; 3) если папки не существует, выдается сообщение «Ошибка» и предлагается снова ввести полный путь к папке; 4) если папка есть, выдать сообщение «Ок».
Пункт 3) должен повторяться до тех пор, пока пользователь не введет путь к существующей папке, или пока не введет exit. Трудность возникла в том, что я не знаю, как заставить пункт 3) повторяться бесконечно. Но начало я написал:

echo -n 'Укажите путь к папке, где находится исходный файл: '; read INPUTDIR
   ### Проверка на существование директории
   if [ ! -d «$INPUTDIR» ]; then
   echo -n «Ошибка! Пожалуйста, введите другой путь: »; read INPUTDIR; fi
echo 'ОК'



Последнее исправление: ghostmansd (всего исправлений: 1)

Примерно так:

while true; do
    printf "Укажите путь к папке, где находится исходный файл, либо \"exit\" для выхода: "
    read d
    [ -d "${d}" -o "${d}" = "exit" ] && break
done

Deleted
()

замените if-then-fi на while-do-done ?

AIv ★★★★★
()

На файловой системе не может быть никаких папок. Папки, корзины и прочее - на рабочем столе.

Murr ★★
()
false
until [ $? -eq 0 ]
do
echo -n 'Укажите путь к папке, где находится исходный файл: '; read INPUTDIR
test -d $INPUTDIR
done
AITap ★★★★★
()
Ответ на: комментарий от AITap

AITap, работает отлично! А можно сюда добавить возможность правильно понимать '~'? Как будет тогда выглядеть итоговый скрипт?

ghostmansd
() автор топика
Ответ на: комментарий от babusha

Который на bash. У меня весь скрипт на bash, я пока еще не осваиваю Ruby, хотя в дальнейшем хочу этим заняться.

ghostmansd
() автор топика
Ответ на: комментарий от ghostmansd

А зачем вообще в скрипте нужна интерактивность, когда проще как для программиста, так и для пользователя организовать работу с аргументами командной строки (пользователь сможет, в свою очередь, написать скрипт, который использует Ваш или просто пользоваться автодополнением при наборе команды)?

AITap ★★★★★
()
Ответ на: комментарий от AITap

+++++100500

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

babusha
()
Ответ на: комментарий от babusha

> как автоматизировать работу с интерактивными командами
В принципе возможно, хотя и проблематично - при помощи expect.

AITap ★★★★★
()
Ответ на: комментарий от ghostmansd

В любом случае, сделайте его дальнейшую автоматизацию легче и используйте аргументы командной строки.

AITap ★★★★★
()
Ответ на: комментарий от babusha

man expect сойдёт? Там всё описано достаточно подробно, включая язык, на котором описывается взаимодействие с программой.

AITap ★★★★★
()
Ответ на: комментарий от AITap

AITap, я вот подумал и решил все-таки сделать две реализации: для разработчиков и для любителей вроде меня. А то получается, что я делаю полезный инструмент, а пользоваться им можно только по отдельности от других программ, а это, согласен, неправильно. Сила Linux - в том, что можешь сам из множества наработок умных людей сделать свою, а вдруг и моя поделка кому пригодится? Поскольку там не так много команд, это не займет много времени.

ghostmansd
() автор топика
Ответ на: комментарий от ghostmansd

> а пользоваться им можно только по отдельности от других программ
Почему это?

Кстати, кто мешает просто спрашивать при помощи read не указанные в командной строке параметры или вообще пользоваться dialog/kdialog/zenity для получения пути к искомой директории и прочих параметров?

AITap ★★★★★
()

Студентота приходит на ЛОР за решением лабораторных (что не удивительно) и получает их на первой же странице треда (что удивительно).

ЛОР не торт.

geekless ★★
()
Ответ на: комментарий от geekless

Ты нарушил главное правило руби! «Keep it simple, stupid!» Ты все усложнил и сделал весьма неочевидным способом. Вэлком ту петун, там только одно единственное правильное решение, в отличии на руби, где все ровным счетом наоборот «It's a fucking a lot to do it!»

babusha
()
Ответ на: комментарий от babusha

Ты нарушил главное правило руби!

Попробуй поставить больше восклицательных знаков для убедительности, чтобы никто не заметил, что ты использовал exist вместо directory, while not вместо until, if not вместо unless, предусловие вместо постусловия или loop-цикла, а также два идентичных условия подряд вместо одного. Тут всё вместе: и нарушение KISS, и нарушение DRY, и просто несоответствие программы заданию. Это кажется невероятным, как в 4-х строках кода можно сделать столько ошибок.

Ты все усложнил и сделал весьма неочевидным способом.

Не спорю: единственный цикл с телом из двух строк и простейшим условием — весьма сложное и неочевидное построение для таких неосиляторов, как ты.

Но в одном ты прав, мой толстый друг: в моём варианте кода нет вывода диагностики с ошибкой. Исправим это недоразумение:

d = ''
loop {
	print "> "
	d = gets.chomp
	break if File.directory? d
	puts "Not a directory."
}

на руби, где все ровным счетом наоборот «It's a fucking a lot to do it!»

Программу в стиле PHP можно написать на любом языке программирования, что ты блестяще и демонстрируешь.

geekless ★★
()
Ответ на: комментарий от geekless

Фу, как толсто! Ты как уличная собака, ее 1 раз покормишь и она от тебя больше никуда не денется.

babusha
()
Ответ на: комментарий от geekless

Я не решаю лабораторную. Я вообще на филфаке учусь, уважаемый. И вот что: а) я никого не заставляю себе помогать; б) я вполне положительно отношусь к тому, что меня могут отправить читать маны вместо того, чтобы написать готовый код. Я вообще на Линуксе немногим более месяца сижу, и, очевидно, не могу всего знать. Поэтому я и обращаюсь за помощью к людям, которые гораздо умнее меня в этом плане, а не к настолько жалким и глупым троллям, как ты.

ghostmansd
() автор топика
Ответ на: комментарий от geekless

Друг мой, ты - самый убогий тролль, которого я когда-либо встречал в моей жизни. Сколько бесполезных и безразличных окружающим действий, вместо того, чтобы просто замолчать и не позориться. Иди, дружочек, комментируй статьи на Ленте.ру.

ghostmansd
() автор топика

Если применять это на практике - то google:// inotify.

anon_666
()
Ответ на: комментарий от Murr

> Папки, корзины и прочее - на рабочем столе.

Не, я понимаю, куча стикеров, черновиков, книг, тетрадей на столе. Но зачем на стол ставить какие то корзины? Им место в укромном углу помещения.

andreyu ★★★★★
()

Вот заведомо правильный вариант, не работает разве что если прямо в имени каталога символ перевода строки (0Ah, если склероз не изменяет) есть:

#!/bin/bash
while :; do
 echo -n 'Укажите путь к папке, где находится исходный файл, либо "exit" для выхода:>  '
 read -r d
 [[ $d ]] || {
  echo 'С фига ли ты пустую строку мне ввёл?! А ну повтори чё сказал!' >&2
  continue
 }
 [[ -d $d || $d == 'exit' ]] && break
 echo 'Ошибка: нет такого каталога' >&2
done
[[ $d == 'exit' ]] && exit 0
echo 'Есть такой каталог, так что продолжим экзекуцию...'

DRVTiny ★★★★★
()
Ответ на: комментарий от andreyu

>Не, я понимаю, куча стикеров, черновиков, книг, тетрадей на столе. Но зачем на стол ставить какие то корзины? Им место в укромном углу помещения.

Поддерживаю ваше чувство прекрасного, товарищ!

Murr ★★
()
Ответ на: комментарий от AITap

Цитата (2AITap, 19.03.2011 20:25:56): «А зачем вообще в скрипте нужна интерактивность, когда проще как для программиста, так и для пользователя организовать работу с аргументами командной строки (пользователь сможет, в свою очередь, написать скрипт, который использует Ваш или просто пользоваться автодополнением при наборе команды)?»

Передаются ли переменные из одного скрипта в другой? Допустим, я в скрипте A указал значение переменных $IN и $OUT. Если я запущу скрипт B командой «$bash script B» (а он использует одноименные переменные), передадутся ли они в скрипт? Если не передадутся так, то как их можно передать?

ghostmansd
() автор топика
Ответ на: комментарий от ghostmansd

Успел разобраться с этим вопросом сам. :-)

ghostmansd
() автор топика
Ответ на: комментарий от by_zero

> логично, что должен быть цикл.

Цикл - это рекурсия для бедных.

anonymous
()
Ответ на: комментарий от ghostmansd

> Если не передадутся так, то как их можно передать?
Для bash:
IN=$IN OUT=$OUT script some-parameters
(именно в одну строку).

Насчёт POSIX shell не знаю; универсальным вариантом будет env IN=$IN OUT=$OUT script some-parameters.

AITap ★★★★★
()
Ответ на: комментарий от AITap

А я в скрипте A установил значения переменных $A - $D, затем запустил скрипт B вот так: bash B.sh $A $B $C $D. В скрипте B уже прописано: A=$1, B=$2, C=$3, D=$4.

ghostmansd
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.