Bash равенство не ведет себя так, как я этого ожидаю - PullRequest
0 голосов
/ 16 апреля 2020

Я хочу проверить, не прошла ли последняя команда или нет в bash. Я основываю этот мини-скрипт на этом

#!/bin/bash
mkdir nothere/cantcreate

echo $?

if [ $? -eq 0 ]; then
    echo "command succeed"
    else
    echo "command failed"
fi

Это печатает следующее:

mkdir: не может создать каталог nothere / cantcreate: такого файла нет или каталог

1

команда выполнена успешно

Я ожидаю, что она напечатает command failed, поскольку значение $? равно 1. Почему равенство не ведет себя как я ожидаю?

Ответы [ 2 ]

2 голосов
/ 16 апреля 2020

Как уже упоминалось в разделе комментариев, при переходе к условию if $? соответствует коду выхода echo $?.

Самый простой и надежный способ - ввести саму команду. в предложении if:

#!/bin/bash
if mkdir nothere/cantcreate; then
    echo "command succeed"
else
    echo "command failed"
fi
1 голос
/ 16 апреля 2020

echo $? сама по себе является командой, которая успешно печатает код завершения сбоя mkdir. Если вы хотите захватить код выхода mkdir, вам нужно сохранить его сразу после вызова команды.

#!/bin/bash
mkdir nothere/cantcreate
RESULT=$?
echo $RESULT

if [ $RESULT -eq 0 ]; then
  echo "command succeed"
else
  echo "command failed"
fi
...