Linux Bash Script, Single Command But Multiple Lines?
Solution 1
All you should need to do is add "\" at the end of each line and it should be good to go.
So yours will look like:
tar -cvpzf /share/Recovery/Snapshots/$(hostname)_$(date +%Y%m%d).tar.gz \
--exclude=/proc \
--exclude=/lost+found \
--exclude=/sys \
--exclude=/mnt \
--exclude=/media \
--exclude=/dev \
--exclude=/share/Archive \
/
A Few Shortcuts
(based on your comment update for setting $HOSTNAME)
$HOSTNAME
Two options to set that:
Set HOSTNAME
HOSTNAME=$(hostname)
Use command substitution (e.g.
$(command)
)So it would look like above. That just makes the command run before using it.
$DATE
Another variable avoided would be easily:
$(hostname)_$(date +%Y%m%d).tar.gz \
$ man date
will have the formats for the date options, the above is YYYYmmdd
Solution 2
Use the backslash to continue a command on the next line:
tar -cvpzf /share/Recovery/Snapshots/$HOSTNAME_$DATE.tar.gz \
--exclude=/proc \
--exclude=/lost+found \
--exclude=/sys \
--exclude=/mnt \
--exclude=/media \
--exclude=/dev \
--exclude=/share/Archive \
/
Solution 3
You can use this in bash
PARAMS=(
-cvpzf /share/Recovery/Snapshots/$HOSTNAME_$DATE.tar.gz
--exclude=`enter code here`/proc
--exclude=/lost+found
--exclude=/sys
--exclude=/mnt
# this is a comment
--exclude=/media
--exclude=/dev
# --exclude=/something
--exclude=/share/Archive
/
)
tar ${PARAMS[@]}
Solution 4
The same command, but with comments for each line, would be:
tar -cvpzf /share/Recovery/Snapshots/$(hostname)_$(date +%Y%m%d).tar.gz `#first comment` \
--exclude=/proc `#second comment` \
--exclude=/lost+found `# and so on...` \
--exclude=/sys \
--exclude=/mnt \
--exclude=/media \
--exclude=/dev \
--exclude=/share/Archive \
/
Solution 5
Axel Heider provided a good alternative to backslashes. Two notes:
- The command can be included in the list, and
- The use of the list should be in double quotes
"${PARAMS[@]}"
, so that any spaces in parameters get preserved.
#!/bin/bash params=( show hello, world "multi word" ) function show { echo --- Showing \""$@"\" as parameters --- for i in "$@"; do echo i=$i done } ${params[@]} "${params[@]}"
outputs
$ bash test.sh --- Showing "hello, world multi word" as parameters --- i=hello, i=world i=multi i=word --- Showing "hello, world multi word" as parameters --- i=hello, i=world i=multi word
Related videos on Youtube
Jay LaCroix
Updated on September 18, 2022Comments
-
Jay LaCroix over 1 year
I have the following script I wrote by searching Google, and it backs up my Linux system to an archive:
#!/bin/bash # init DATE=$(date +20%y%m%d) tar -cvpzf /share/Recovery/Snapshots/$HOSTNAME_$DATE.tar.gz --exclude=/proc --exclude=/lost+found --exclude=/sys --exclude=/mnt --exclude=/media --exclude=/dev --exclude=/share/Archive /
This works, but I am wondering if I can format the script to show the command over multiple lines, something like this, so it is easy to edit later:
tar -cvpzf /share/Recovery/Snapshots/$HOSTNAME_$DATE.tar.gz --exclude=/proc --exclude=/lost+found --exclude=/sys --exclude=/mnt --exclude=/media --exclude=/dev --exclude=/share/Archive /
That way it is easier to read and edit later. Is it possible to format a Bash script this way?
-
Jay LaCroix over 11 yearsThanks guys. One last thing. There seems to be a problem with the file name portion of my script: $HOSTNAME_$DATE.tar.gz When I run the script now, the output file is: 20121120.tar.gz
-
nerdwaller over 11 yearsI went back to update it to make it more useful and get the indentations. I love SU though, by and large.
-
nerdwaller over 11 yearsIf you want your actual "hostname" put it in back ticks (the tilde "~" key above tab):
/share/Recovery/Snapshots/`hostname`_$DATE.tar.gz
-
nerdwaller over 11 yearsAnytime @JayLaCroix - Welcome to SU!
-
andrybak over 9 years
-
TheDefinitionist over 7 yearsThis doesn't work for me like eg. in
alias ub='source ~/.bash_aliases \ && source $HOME/.bash_aliases \ && echo "aliases updated."';
-
Paul over 7 years@TheDefinitionist Sounds like a different problem to this one. Perhaps open a new question?
-
SDsolar almost 7 yearsCan I line up the backslashes in a column on the right?
-
Paul almost 7 years@SDsolar You can use spaces and tabs to line up the slashes.
-
Timo over 3 yearsThis works with withspaces as a separator. If I have
ssh
on the first line and commands on the following lines, I think I need a semicolon as well besides backslash. -
Charlie Parker over 2 yearswhat do you need to do for the last argument do you still need the ``?
-
timkay about 2 yearsShould be
tar "${PARAMS[@]}"
, so that params with spaces get preserved. -
roneo.org about 2 yearsThis technique is not recommended when performances matter: "note that this technique is expensive because it creates a subshell for each of such “inline comments” during execution. It is only suitable if the commands performance or cost is not a problem." Source: systutorials.com/…