次のスクリプトで構文エラーが発生しますunexpected token fi
。Permission denied
cd /home/NorthStar/Dhruva/server-specific-scripts/crons/ResetETA
su postgres -c "psql -d "Dhruva" -f /home/NorthStar/Dhruva/server-specific-scripts/crons/db-connection/query.sql" >> reset.log 2> reset.log
if su postgres -c "psql -d "Dhruva" -f /home/NorthStar/Dhruva/server-specific-scripts/crons/db-connection/query.sql; then
printf su postgres -c "psql -d "Dhruva" -f /home/NorthStar/Dhruva/server-specific-scripts/crons/db-connection/query.sql\n' >> resset.log
else
printf su postgres -c "psql -d "Dhruva" -f /home/NorthStar/Dhruva/server-specific-scripts/crons/db-connection/query.sql\n' >> reset_error.log
fi
ベストアンサー1
不均衡な引用
あなたが見ているのは、バランスのとれない引用の混乱の例です。
一重引用符と二重引用符のすべてのペアはバランスを取る必要があります。つまり、最初の引用符があるたびに、後で同じステートメントに閉じる引用符が必要です。そして正しく入れ子にする必要があります。 (たとえばecho "foo 'bar' baz"
動作しますが、echo "foo 'bar baz"'
動作しません。
したがって、あなたの場合sh
(またはあなたが使用しているBourneシェルが何であれ)、引用符を解釈してください。まるでバランスが取れており、スクリプトの一部が望ましくない部分、つまりほとんどの構成部分が「引用」されますif .. else .. fi
。
スクリプトの別の(省略された)例:su "psql -d "Dhruva" blah.sql"
この例では、文字列はDhruva
実際にあります。外部引用、これはおそらくあなたが望むものではありません。
本質的に問題は、引用符のバランスが合わないということです。私はあなたのスクリプトをさらに分析し、あなたが望むものが何であるかわからないことを確認し、修正版を提案しますが、スクリプトに対するあなたの意図をよく理解していないことを認めます。
「固定」スクリプト
「固定」を入れました脅威的な引用なぜなら、スクリプト構文を修正する方法を教えてもらっても、まだいくつかの懸念があるからです。これについては、この回答の最後にリストします。
一部のリファクタリングと引用の修正
まず、簡単にリファクタリングできる繰り返し要素を含む非常に長い行があるため、すでに「修正」作業が簡単になりました。
#!/bin/sh
cd /home/NorthStar/Dhruva/server-specific-scripts/crons/ResetETA
db="Dhruva"
file="/home/NorthStar/Dhruva/server-specific-scripts/crons/db-connection/query.sql"
cmd="psql -d $db -f $file"
su postgres -c "$cmd" >> reset.log 2> reset.log
if su postgres -c "$cmd"; then
printf su postgres -c "$cmd" >> resset.log
else
printf su postgres -c "$cmd" >> reset_error.log
fi
上記の構文は現在有効ですが、まだいくつかの質問があります。
$cmd
そのように何度も走る必要がありますか?出力は変更されますか(クエリに副作用がありますか?)、結果を保存してログファイルに別々に追加できますか?- 太田ですか
resset.log
、それとも実際に3つの異なるログがありますか? printf ...
ここでは(おそらく)やりたいことをしていません。printf
最初のパラメータはフォーマット文字列(この場合"su"
)なので、を印刷しますsu
。