if/else コマンドの構文エラー

if/else コマンドの構文エラー

このコマンドに問題がありますか?構文エラーがあるようですが、どこにいるのかわかりません。

sh -c 'mongodump --host mongo_db --gzip --db db $$(if [ $TYPE = "hour" ]; then echo "--archive=/backup/hour/$$(date +"%H").gz"; elif [ $TYPE = "day" ]; then echo --archive=/backup/day/$$(date +"%d").gz; fi)'

TYPE変数に基づいてアーカイブ名を設定する必要があります。

  • タイプが「時間」の場合、出力は次のようになります。/backup/hour/10.gz
  • タイプが「day」の場合、出力は次のようになります。/backup/day/1.gz
  • タイプが「月」の場合、出力は次のようになります。/backup/2017-09.gz

答え1

sh -c 'echo mongodump --host mongo_db --gzip --db db --archive="$(
    case "$1" in 
        hour)  f="%H";; 
        day)   f="%d";; 
        month) f="%Y-%m";; 
        *)     f="unknown"; set -- "";; 
    esac
    date "+/backup/$1/$f.gz"
)"' x "$TYPE"
  • 乾いた
  • case長いより読みやすいif/elif/elif...
  • これはx "$TYPE"、参照ゲームをする必要なく「外部」変数をsh本体に渡す方法です。 sh本文の「x」は$ 0になり、$ TYPEは$ 1になります。
  • 内部的に改行が許可されています$(...)
  • %書式文字列に非表示を配置できますdate

答え2

$TIME引用符のない変数()と構文エラー()があります$$(...)。また、TYPE環境変数ではなくシェル変数の場合、その値は一重引用符で囲まれたスクリプトにはまったく表示されませんsh -c

ステートメントは次のとおりです。

sh -c "mongodump --host mongo_db --gzip --db db \"$(if [ \"$TYPE\" = \"hour\" ]; then echo \"--archive=/backup/hour/$(date +%H).gz\"; elif [ \"$TYPE\" = \"day\" ]; then echo --archive=/backup/day/$(date +%d).gz; fi)\""

(または他のもの...)

シェルが$TYPE最も内側のサブシェルから拡張され、まだ二重引用符で囲まれていることを望むので、正しい引用符は問題になります。

必要ない場合sh -c(必要なものは何も表示されません)、少し簡単になります。

mongodump --host mongo_db --gzip --db db "$(if [ "$TYPE" = "hour" ]; then echo "--archive=/backup/hour/$(date +%H).gz"; elif [ "$TYPE" = "day" ]; then echo "--archive=/backup/day/$(date +%d).gz"; fi)"

ただし、isがNorで$TYPEない場合は空のコマンド置換を提供するので、次のようにすることをお勧めします。dayhour

case "$TYPE" in
    hour) archive="/backup/hour/$(date +%H).gz" ;;
    day)  archive="/backup/day/$(date +%d).gz"  ;;
    *)
       printf 'Error: Unknown TYPE "%s"\n' "$TYPE" >&2
       exit 1 ;;
esac

sh -c "mongodump --host mongo_db --gzip --db db --archive=$archive"

# or just

mongodump --host mongo_db --gzip --db db --archive="$archive"

これにより、読み、理解、保守が容易になります。

答え3

設定されていない、空である、または完全に空白で構成されている場合、TYPEステートメントはif [ = "hour" ]構文エラーになります。

を使用しているので、sh一般的な回避策はプレフィックスを使用することです。if [ "x$TYPE" = "xhour" ]

より強力な二重括弧構文""if [ = "hour" ]例:shbashif [[ "$TYPE" = "hour" ]]

関連情報