如何将if语句放在lftp块内

1 人关注

我正在写一个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
  echo "Non-prod mode. Keeping files"

然而,在EOF之前的lftp块中不允许使用if语句。

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

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

1 个评论
BTW, [ $2 = "prod" ] 所引用的正是错误的东西。替换代码1】不需要被引用(它只能被解析为一种方式,即作为一个单字),但 $2 如果不被引用,可以评估为任何数量的壳字,因此也是 [ 的任何数量的论据。这是一类问题,即 shellcheck.net 可以找到。
linux
bash
if-statement
eof
lftp
ddd
ddd
发布于 2016-12-28
1 个回答
Charles Duffy
Charles Duffy
发布于 2016-12-28
已采纳
0 人赞同

一个命令的替换就可以了。

#!/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
      echo "Non-prod mode. Keeping files" >&2

注意,在对heredoc的替换里面,我们要把日志信息路由到stderr,而不是stdout。这一点很重要,因为stdout上的所有内容都会成为被替换到发送到lftp的heredoc中的命令。

其他关于命令替换的注意事项也适用。它们在子壳中运行,所以在命令替换中进行的赋值不会在子壳之外适用,而且启动它们会有一定的性能代价。

一个更有效的方法是将你的条件成分存储在一个变量中,并在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