To split long commands into readable commands that span multiple lines, we need to use the backslash character (\). The backslash character instructs bash to read the commands that follow line by line until it encounters an EOL.
The special shell variable $IFS is used in bash for splitting a string into words. $IFS variable is called Internal Field Separator (IFS) that is used to assign the specific delimiter for dividing the string. Word boundaries are identified in bash by $IFS. White space is the default delimiter value for this variable.
break is a special built-in shell command. In the tcsh shell, break causes execution to resume after the end of the nearest enclosing foreach or while. The remaining commands on the current line are executed. Multilevel breaks are thus possible by writing them all on one line.
It's a bit of a hack, but this works:
mycommand \
--server myserver \
--filename "extremely/long/file/name/"`
`"that/i/would/like/to/be/able/to/break/"`
`"up/if/possible" \
--otherflag \
--anotherflag
Bash concatenates string literals that are adjacent, so we take advantage of that. For example, echo "hi" "there"
prints hi there
whereas echo "hi""there"
prints hithere
.
It also takes advantage of the backtick operator, and the fact that a bunch of spaces evaluates to nothing.
You can use a variable :
file=extremely/long/file/name
file+=/that/i/would/like/to/be/able/to/break
file+=/up/if/possible
mycommand\
--server myserver\
--filename $file\
--flag flag
I define a short strcat function at the top of my bash script and use an inline invocation to split things up. I sometimes prefer it to using a separate variable because I can define the long literal in-line with the command invocation.
function strcat() {
local IFS=""
echo -n "$*"
}
mycommand \
--server myserver \
--filename "$(strcat \
extremely/long/file/name/ \
that/i/would/like/to/be/able/to/break/ \
up/if/possible)" \
--otherflag \
--anotherflag \
I also like this approach for when I have to enter a long CSV of values as a flag parameter because I can use it to avoid typing the comma between values:
function strjoin() {
local IFS="$1"
shift
echo -n "$*"
}
csv_args=(
foo=hello
bar=world
"this=arg has spaces in it"
)
mycommand \
--server myserver \
--csv_args "$(strjoin , "${csv_args[@]}")" \
--otherflag \
--anotherflag \
Which is equivalent to
mycommand \
--server myserver \
--csv_args "foo=hello,bar=world,this=arg has spaces in it" \
--otherflag \
--anotherflag \
One can also use an array variable
file=(extremely/long/file/name
/that/i/would/like/to/be/able/to/break
/up/if/possible)
IFS=''
echo mycommand\
--server myserver\
--filename "${file[*]}"\
--flag flag
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With