bashが正しい括弧を見つけることができませんか?

bashが正しい括弧を見つけることができませんか?

SynologyボックスにMariaDBインスタンスを構築するためのbashスクリプトを作成しています。実行すると動作しますが、エラーが発生します。

admin@synology:/volume1/@appstore/MariaDB10/usr/local/bip$ ./mysql_backup
./mysql_backup: line 7: [: missing `]'

admin@synology:/volume1/@appstore/MariaDB10/usr/local/bip$ head -10 mysql_backup
#!/bin/bash

DBBACKUP=/volume1/remotebackup/mnt/devmysql.sql.gz
ERRFILE=/volume1/remotebackup/mnt/devmysqlerr.log


if [ -f "${DBBACKUP}.prev" && ! -f "${ERRFILE}" ] ; then
        rm -f "${DBBACKUP}.prev"
        mv "${DBBACKUP}" "${DBBACKUP}.prev"
fi

スペースと2番目の終端文字「]」を追加すると、まだ同じエラーが発生します。入れ子になった「if」ステートメントは解決策を提供しましたが、面倒なことに、一部の操作は期待どおりに機能しませんでした。

ベストアンサー1

両方の標準テストの構文は次の&&とおりです。

[ expression_1 ] && [ expression_2 ]

または以下を使用してください。古い-aオプション(こんなことはしないで)、

[ expression_1 -a expression_2 ]

あなたのケースを例に挙げると、

if [   -f "$DBBACKUP.prev" ] &&
   [ ! -f "$ERRFILE"       ]
then
    mv "$DBBACKUP" "$DBBACKUP.prev"
fi

の場合は、以前と同じように使用bashできますが、&&非標準[[ ... ]]テストにのみ使用できます。

[[ expression_1 && expression_2 ]]

次のように書くこともできます。

[[ expression_1 ]] && [[ expression_2 ]]

特殊以外はシェル演算子です[[ ... ]]&&2 つのコマンドを分離します。, 2 番目は、1 番目が成功した場合にのみ実行されます。したがって、次のコマンドが与えられます。

[ expression_1 && expression_2 ]

シェルが最初に実行され、末尾の[ expression_1シェルが欠落して]エラーが発生します。

また見なさい:

  • POSIX仕様test[
  • man testおよび/またはman [マニュアルの提供外部 testそして[命令。ほとんどのシェルにはこれらのコマンドが組み込まれていますが、一部の特定のテスト演算子は異なる場合がありますが、意味は同じでなければなりません(非標準演算子を実装できます)。
  • help [help testおよびシェルhelp [[にはbash、シェルに組み込まれているコマンドの簡単な説明が表示されますbashbashシェル組み込み関数の詳細については、bashマニュアル(man bash)を参照してください。

おすすめ記事