Как я могу разбить команду на несколько строк при помощи оператора 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) конец строки сломает его.