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
、シェルに組み込まれているコマンドの簡単な説明が表示されますbash
。bash
シェル組み込み関数の詳細については、bash
マニュアル(man bash
)を参照してください。