2017-05-22 12 views
1

iOS X上にファイルをサーバーにアップロードするかどうかを尋ねるBashスクリプトファイルを作成しています。 sftpコマンド(デリミタ付き)はif文の外側でうまく動作しますが、if文の中にsftpコマンド(区切り文字付き)を置くと、次のエラーメッセージが表示されます。 "upload.sh:line nnn:syntax error:unexpected endファイル "heredocが「ファイルの予期しない終了」エラーを表示する

printf "Upload file? [y]es?" 
read -r input1 
if [ $input1 == "y" ] || [ $input1 == "yes" ]; then 
    sftp -i key.txt [email protected] << DELIMITER 
    put local/path/to/file /server/upload/dir 
    quit 
    DELIMITER 
fi 

私はここで何が欠けていますか?

+3

ヘレドックマーカーの末尾をインデントしないでください(「DELIMITER」)。 shellcheck.netでスクリプトをチェックしてください。 – codeforester

答えて

3

heredocマーカーをインデントしてはいけません(インデント用にスペースを使用していると仮定します)。あなたのコードをこのように書き換え:

printf "Upload file? [y]es?" 
read -r input1 
if [ "$input1" == "y" ] || [ "$input1" == "yes" ]; then 
    sftp -i key.txt [email protected] << DELIMITER 
    put local/path/to/file /server/upload/dir 
    quit 
DELIMITER 
fi 

それは、単語の分割、グロブ、およびテスト([ ... ])コマンドを壊す空の文字列に起因する問題を回避するために、二重引用符であなたの変数を囲むことが重要です。


も参照してください:

+1

ありがとう@codeforester!私はheredocマーカーのインデントの問題を知らなかった。 – Jawa

1

あなたはヒアドキュメントとTABインデントを使用したい場合は、リダイレクト演算子<<が、その結果、-(ダッシュ)を続けなければなりません。 <<-にあります。 heredoc内の任意の先頭のTABは無視されます。

printf "Upload file? [y]es?" 
read -r input1 
if [ "$input1" = "y" ] || [ "$input1" = "yes" ]; then 
    sftp -i key.txt [email protected] <<- DELIMITER 
     put local/path/to/file /server/upload/dir 
     quit 
    DELIMITER 
fi 

の代替ではなく、ヒアドキュメントの使用することができ、簡単な入力のリダイレクト次のようになります。

printf "Upload file? [y]es?" 
read -r input1 
if [ "$input1" = "y" ] || [ "$input1" = "yes" ]; then 
    sftp -i key.txt [email protected] < \ 
    <(echo "put local/path/to/file /server/upload/dir ; quit") 
fi 

==を使用する理由はありません。単一のかっこ内の文字列を比較する場合は、代わりに=を使用してください。二重括弧を使用している場合は意味が変わるため、一貫して使用する方が良い傾向にあります。

関連する問題