2016-11-15 1 views
1

У меня возник вопрос о структуре условных операторов, которые должны использоваться в командной строке bash.Структура Bash условно - переменная в сравнении с каталогом

This question показывает:

if [ -z "${VAR}" ]; then echo "VAR is unset or set to the empty string" 

Здесь оказывается, что then только вызывается, когда переменная VARне существует. Это подтверждается от here.

Однако, для каталогов, this question шоу:

if [ -d $directory_name ]; then echo "Directory already exists" 

Здесь, казалось бы, что then только вызывается, когда переменная directory_nameделает существует. Это подтверждается от here (прокрутите вниз до -d).

Моя проблема: Недавно я попытался проверить, есть ли variable existed or not. Когда я попытался применить ту же логику к каталогам, я был удивлен, что это невозможно. Вот то, что я пробовал:

dir_full_path='/mnt/iso' 
if [ -d $dir_full_path ]; then echo 'Directory does not exist'; else echo 'Does exist'; fi 

Когда я запустил эти 2 строки, путь к каталогу /mnt/iso сделал не существует. Поэтому я ожидал, что условие будет возвращено Directory does not exist. Вместо этого он сделал обратное, и он вернул Does exist.

Вопрос: Это совершенно сбивает с толку, так как это, кажется, как же структура условного не может быть использован для каталога и для переменной. Это правда? Если да, то разве это различие документировано где-то?

+0

Я не вижу какой-либо вопрос с подходом 2 линии, за исключением того, что это безопаснее приложите переменную в двойные кавычки (чтобы вы не попадали в проблему синтаксиса, если переменная не имеет значения), таким образом: if [-d "$ dir_full_path"]; затем ... – codeforester

+1

'-d' проверяет, является ли его аргумент каталогом. '-z' проверяет, является ли его аргумент пустой строкой. – Barmar

+1

Вы, кажется, ответили на свой вопрос: ** тогда вызывается только тогда, когда существует переменная имя_каталога **. Почему вы ожидаете, что она будет работать по-разному для '-d $ dir_full_path'? – Barmar

ответ

2

Вот правильное использование этих команд, которые можно найти, запустив помощи теста:

if [ -z "$j" ] 
then 
    echo '$j is empty' 
fi 

if [ -n "$j" ] 
then 
    echo '$j is not empty' 
fi 

if [ -d /mnt/iso ] 
then 
    echo '/mnt/iso is a directory' 
fi