このコマンドに問題がありますか?構文エラーがあるようですが、どこにいるのかわかりません。
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
ない場合は空のコマンド置換を提供するので、次のようにすることをお勧めします。day
hour
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" ]
例:sh
。 bash
if [[ "$TYPE" = "hour" ]]