如何将if语句放在lftp块中

时间:2016-12-27 19:56:14

标签: linux bash if-statement eof lftp

我正在编写一个bash脚本,使用lftp从ftp服务器下载文件。我想根据第二个输入参数删除文件。

#!/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
else
  echo "Non-prod mode. Keeping files"
fi
EOF

但是,如果在EOF之前的lftp块中不允许声明。

Unknown command `if'.
Unknown command `then'.
Usage: rm [-r] [-f] files...
Unknown command `else'.

如何在这样的块中嵌入if语句?

1 个答案:

答案 0 :(得分:2)

命令替换将执行:

#!/bin/bash

cd "$1" || exit
mode=$2

lftp -u found,e48RgK7s sftp://ftp.xxx.org << EOF
set xfer:clobber on
mget *.xml
$(
    if [ "$mode" = "prod" ]; then
      echo "Production mode. Deleting." >&2 # this is logging (because of >&2)
      echo "mrm *.xml"                      # this is substituted into the heredoc
    else
      echo "Non-prod mode. Keeping files" >&2
    fi
)
EOF

请注意,在替换heredoc时,我们将日志消息路由到stderr,而不是stdout。这是必不可少的,因为stdout上的所有内容都成为替换为发送到lftp的heredoc的命令。

命令替换的其他警告也适用:它们在子shell中运行,因此在命令替换中进行的赋值不会在其外部应用,并且启动它们会产生性能成本。

更有效的方法是将条件组件存储在变量中,并在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=
    ;;
esac

lftp ... <<EOF
set xfer:clobber on
mget *.xml
$post_get_command
EOF