2015-09-30 4 views
0

Я пишу сценарий оболочки, который принимает в качестве единственного аргумента каталог. Мне нужно проверить, существует ли каталог, прежде чем я сделаю что-нибудь еще. Каталог может быть абсолютным или относительным. Я знаю, что я могу проверить наличие абсолютного каталога (например,/Users/Keith/Документы/TestFolder) с использованиемBash: проверьте, существует ли относительный путь

if [ -d "$1"]; then 
    # do something if the absolute directory exists 
fi 

Однако, если рабочий каталог/Users/Китом/Документы/и Звоню сценарий и передать только «TestFolder», тогда тест в этом операторе if будет оцениваться как false, хотя TestFolder существует в текущем рабочем каталоге.

Я попытался преобразования каталог в абсолютный каталог с помощью

abs_path=`cd "$1"; pwd` 

, а затем проверить на наличие абсолютного пути, используя, если заявление выше. Это прекрасно работает (признает, что «TestFolder» существует, даже если это все, что я передаю в качестве аргумента) при условии, что каталог, переданный скрипту, действительно существует, но если он этого не сделает, это не сработает.

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

У меня явно нет эксперта по bash - любой совет будет очень благодарен!

ответ

3

Однако, если рабочий каталог/Users/Keith/Документы/и я вызываю мой сценарий и передать только «TestFolder», то тест в этом случае заявление будет оценивать ложь, даже если TestFolder существует в пределах текущий рабочий каталог.

Неправильное. Если TestFolder существует в текущем рабочем каталоге, [ -d TestFolder ] будет успешным. Поэтому здесь нет проблем.

Кстати, если вы хотите, чтобы канонизировать в FilePath и у вас есть Gnu Coreutils (которые вы, вероятно, делать, если у вас есть система Linux), то вы можете использовать:

readlink -f "$path" 

или

readlink -e "$path" 

Разница в том, что -f будет успешным, даже если последний компонент в пути не существует (так что это будет успешным, если путь является правдоподобным именем для файла, который будет создан), а -e будет успешным только в том случае, если путь разрешает существующий файл или каталог. См. man readlink для получения более подробной информации.

+0

Хорошо, что слегка неловко ... Вы правы! Он работает. Я провел последний час, работая в одном каталоге слишком далеко, поэтому он не работал. Возможно, кодирование поздно не для меня. Спасибо за вашу помощь и за рекомендацию readlink. Похож на отличный вариант для будущего использования. – kcstricks

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