Как я могу разбить команду на несколько строк при помощи оператора if?
как я могу разделить команду на несколько строк в оболочке, когда команда является частью if
заявление?
это работает:
if ! fab --fabfile=.deploy/fabfile.py --forward-agent --disable-known-hosts deploy:$target; then rc=1
fi
это не работает:
# does not work:
if ! fab --fabfile=.deploy/fabfile.py
--forward-agent
--disable-known-hosts deploy:$target; then
rc=1
fi
вместо выполнения всей команды я получаю:
./script.sh: line 73: --forward-agent: command not found
что еще более важно, чего не хватает в моем понимании Bash, что поможет мне понять это и подобные проблемы в будущем?
2 ответов
продолжение строки завершится ошибкой, если после обратной косой черты и перед новой строкой у вас есть пробелы (пробелы или символы табуляции). Без таких пробелов ваш пример отлично работает для меня:
$ cat test.sh
if ! fab --fabfile=.deploy/fabfile.py \
--forward-agent \
--disable-known-hosts deploy:$target; then
echo failed
else
echo succeeded
fi
$ alias fab=true; . ./test.sh
succeeded
$ alias fab=false; . ./test.sh
failed
некоторые детали, продвигаемые из комментариев: обратная косая черта продолжения строки в оболочке не является частным случаем; это просто пример общего правила, что обратная косая черта делает следующий символ литералом, предотвращая любые специальные эффекты, которые он может иметь. В этом случае следующий символ-это новая строка, и предотвращаемый специальный эффект завершает командную строку. Как и во всех других побегах обратной косой черты, не может быть ничего между обратной косой чертой и персонажем, которого он цитирует. Если следующий символ после обратной косой черты-пробел или вкладка, вы просто получаете литеральное пространство или вкладку, и нет никакого эффекта на последующую новую строку, которая по-прежнему завершает команду, как обычно.
для пользователей Windows / Cygwin / WSL etc:
убедитесь также, что ваши окончания строк являются стандартными каналами Unix, т. е. \n
(LF) только. Имея Окна \r\n
(CRLF) конец строки сломает его.