2016-12-27 18 views
0

lftpを使ってftpサーバからファイルをダウンロードするためのbashスクリプトを書いています。私は2番目の入力引数に基づいてファイルを削除したかったのです。if文をlftpブロックに入れる方法

#!/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

ところで、 '[$ 2 =「PROD」]'正確に間違って引用されます'prod'は引用符でくくる必要はありません(1つの単語として一方向にしか解析できません)が、' $ 2'は任意の数のシェル単語に評価されるので、 '[' 、引用されていない場合。これはhttp://shellcheck.net/が見つけることができる問題のカテゴリです。 –

答えて

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 

注意をヒアドキュメントの代わりの内側に、我々は標準エラー出力ではなく、stdoutにログメッセージをルーティングしていること。 stdout上のすべてが、lftpに送られた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 
+0

指摘していただきありがとうございます。 &1に向かうとうまくいかないのは当然のことです。それはそれを説明する。 – ddd

+0

そしてbtw、なぜ最初の行で "exit"するのですか? – ddd

+0

'|| 'cd'が失敗した場合にスクリプトの残りの部分を実行しないようにします。おそらく、間違ったディレクトリにファイルをダウンロードする危険性はないでしょうか? –

関連する問題