不均衡な引用

不均衡な引用

次のスクリプトで構文エラーが発生しますunexpected token fiPermission 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

おすすめ記事