Collectives™ on Stack Overflow
Find centralized, trusted content and collaborate around the technologies you use most.
Learn more about Collectives
Teams
Q&A for work
Connect and share knowledge within a single location that is structured and easy to search.
Learn more about Teams
I am writing a bash script to download files from ftp server using lftp. I wanted to delete the files based on the second input argument.
#!/bin/bash
cd $1
lftp -u found,e48RgK7s sftp://ftp.xxx.org << EOF
set xfer:clobber on
mget *.xml
if [ $2 = "prod"]; then
echo "Production mode. Deleting files"
mrm *.xml
echo "Non-prod mode. Keeping files"
However, if statement is not allowed in the lftp block before EOF.
Unknown command `if'.
Unknown command `then'.
Usage: rm [-r] [-f] files...
Unknown command `else'.
How do I embed if statement in such block?
–
if [ "$mode" = "prod" ]; then
echo "Production mode. Deleting." >&2 # this is logging (because of >&2)
echo "mrm *.xml" # this is substituted into the heredoc
echo "Non-prod mode. Keeping files" >&2
Note that inside the substitution for the heredoc, we're routing log messages to stderr, not stdout. This is essential, because everything on stdout becomes a command substituted into the heredoc sent to lftp
.
Other caveats to command substitution also apply: They run in subshells, so a assignment made inside the command substitution will not apply outside of it, and there's a performance cost to starting them.
A more efficient approach is to store your conditional components in a variable, and expand it inside the heredoc:
case $mode in
prod)
echo "Production mode. Deleting files" >&2
post_get_command='mget *.xml'
echo "Non-production mode. Keeping files" >&2
post_get_command=
lftp ... <<EOF
set xfer:clobber on
mget *.xml
$post_get_command
–
–
–
–
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.