Syntactic Fructose
Syntactic Fructose

Reputation: 20076

bash line continuation cuts off

I have a small bash script bdocs.sh:

#!/bin/bash

REPO=$1

QUICKBOOK=/usr/bin
AUTOINDEX=/usr/bin
XSLTPROC=/usr/bin
DOCBOOK_DTD=/usr/share/xml/docbook/schema/dtd/4.2
DOCBOOK_XSL=/usr/share/xml/docbook/stylesheet/docbook-xsl

if [[ -n "$REPO" ]]; then
    echo cmake -DBOOSTQUICKBOOK_ROOT=$QUICKBOOK             \
        -DBOOSTAUTOINDEX_ROOT=$AUTOINDEX                    \ 
        -DXSLTPROC_ROOT=$XSLTPROC                           \ 
        -DDOCBOOK_DTD_ROOT=$DOCBOOK_DTD                     \
        -DDOCBOOK_XSL_ROOT=$DOCBOOK_XSL                     \ 
        -DHPX_WITH_DOCUMENTATION=On                         \ 
        $REPO
fi

however If I call it > ./bdocs.sh ../repo it only echos:

cmake -DBOOSTQUICKBOOK_ROOT=/usr/bin -DBOOSTAUTOINDEX_ROOT=/usr/bin  
./build_docs.sh: line 14: -DXSLTPROC_ROOT=/usr/bin: No such file or directory
./build_docs.sh: line 16: -DDOCBOOK_DTD_ROOT=/usr/share/xml/docbook/schema/dtd/4.2: No such file or directory
./build_docs.sh: line 17: -DHPX_WITH_DOCUMENTATION=On: command not found
./build_docs.sh: line 18: h: command not found

how come my line continuations aren't working after the second command line argument is passed into cmake?

Upvotes: 0

Views: 97

Answers (2)

chepner
chepner

Reputation: 531125

Slightly less efficient, but more readable, is to use cat and a here document:

#!/bin/bash

REPO=$1

QUICKBOOK=/usr/bin
AUTOINDEX=/usr/bin
XSLTPROC=/usr/bin
DOCBOOK_DTD=/usr/share/xml/docbook/schema/dtd/4.2
DOCBOOK_XSL=/usr/share/xml/docbook/stylesheet/docbook-xsl

if [[ -n "$REPO" ]]; then
    cat <<EOF
cmake -DBOOSTQUICKBOOK_ROOT=$QUICKBOOK
      -DBOOSTAUTOINDEX_ROOT=$AUTOINDEX
      -DXSLTPROC_ROOT=$XSLTPROC
      -DDOCBOOK_DTD_ROOT=$DOCBOOK_DTD
      -DDOCBOOK_XSL_ROOT=$DOCBOOK_XSL
      -DHPX_WITH_DOCUMENTATION=On
      $REPO
EOF
fi

If the formatting of the generated file isn't important (just the format of the generator), use an array to hold the cmake arguments; line breaks are implicit.

#!/bin/bash

REPO=$1

QUICKBOOK=/usr/bin
AUTOINDEX=/usr/bin
XSLTPROC=/usr/bin
DOCBOOK_DTD=/usr/share/xml/docbook/schema/dtd/4.2
DOCBOOK_XSL=/usr/share/xml/docbook/stylesheet/docbook-xsl

arguments=(-DBOOSTQUICKBOOK_ROOT=$QUICKBOOK
           -DBOOSTAUTOINDEX_ROOT=$AUTOINDEX
           -DXSLTPROC_ROOT=$XSLTPROC
           -DDOCBOOK_DTD_ROOT=$DOCBOOK_DTD
           -DDOCBOOK_XSL_ROOT=$DOCBOOK_XSL
           -DHPX_WITH_DOCUMENTATION=On
)
if [[ -n "$REPO" ]]; then
    echo cmake "${arguments[@]}" "$REPO"
fi

Upvotes: 1

MrTux
MrTux

Reputation: 34003

There must not be a space after the \ at the end of the line.

Upvotes: 3

Related Questions