Linux Bash Script, Single Command But Multiple Lines?

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?

5 Answers

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:

  1. Set HOSTNAME

    HOSTNAME=$(hostname)

  2. 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

6

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 \
/
5

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[@]}
1

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 \ /
1

Axel Heider provided a good alternative to backslashes. Two notes:

  1. The command can be included in the list, and
  2. 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

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

You Might Also Like