У меня возник вопрос о структуре условных операторов, которые должны использоваться в командной строке 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
.
Вопрос: Это совершенно сбивает с толку, так как это, кажется, как же структура условного не может быть использован для каталога и для переменной. Это правда? Если да, то разве это различие документировано где-то?
Я не вижу какой-либо вопрос с подходом 2 линии, за исключением того, что это безопаснее приложите переменную в двойные кавычки (чтобы вы не попадали в проблему синтаксиса, если переменная не имеет значения), таким образом: if [-d "$ dir_full_path"]; затем ... – codeforester
'-d' проверяет, является ли его аргумент каталогом. '-z' проверяет, является ли его аргумент пустой строкой. – Barmar
Вы, кажется, ответили на свой вопрос: ** тогда вызывается только тогда, когда существует переменная имя_каталога **. Почему вы ожидаете, что она будет работать по-разному для '-d $ dir_full_path'? – Barmar