[解決済み] bashスクリプトで変数の束縛を解除
2022-02-18 10:35:58
質問
自分のスクリプトをデバッグするときに、先輩から勧められた構文を使ったのですが、どうすれば正しく動作するのかわからなくなってきました。
#!/bin/bash -x
set -ueo pipefail
exec &>/tmp/dq.log
source ${BASH_SOURCE%/*}/env-prd.sh
times=${2:-1}
sleep=${3:-1}
name="all-dq_hourly"
fs_lock_file="/tmp/mwa/jobs/prd-${name}.lock"
( flock -n 200
log="/var/log/mwa/prd/$(date +%Y-%m-%d)__${name}.log"
for i in $(seq 1 $times); do
if [[ ! -f /tmp/stop ]]; then
couple commands
fi
sleep $sleep
done
) 200>"$fs_lock_file" | tee -a $log
rm $fs_lock_file
実行結果から、私は、以下の変数に未束縛の問題があることがわかりました。
tee -a $log
の部分です。
couple commands
はちゃんと実行されます。ログパスでbackticsを使ってみましたが、効果はありませんでした。fs_lock_fileと同じ問題だと思いますが、まだロギングを先に修正していません。
誰か私の目を覚まして、何が足りないのか教えてください。スクリプトのロギングを指定されたパスにすることができないのです。
どうすればいいですか?
を変数に代入しています。
log
の中にある
サブシェル
(
[...]
)
. その変数はそのサブシェルの外では束縛されない。
この場合、単に
log
サブシェルの外側で、つまり、サブシェルブロックの前に変数の割り当てを移動します。
一般に同様のケースでは、サブシェルの括弧を中括弧に置き換えてみることができます (
グループコマンドの構文
)
{
[...]
}
.
グループコマンドは、現在のシェルで実行されます。サブシェル構文とは対照的に、リストは、ニューラインまたはセミコロンで終了しなければならないことに注意してください。
また 一般的なベストプラクティス 変数名、特に定数をスクリプトや関数の最初に設定することで、この種のバグを回避することができます。
関連
-
[解決済み] Bashスクリプトのソースディレクトリをスクリプト自体から取得するにはどうすればよいですか?
-
[解決済み] Bashシェルスクリプトでディレクトリが存在するかどうかを確認するにはどうすればよいですか?
-
[解決済み] Bashで通常のファイルが存在しないかどうかを判断する方法を教えてください。
-
[解決済み] Bashで文字列変数を連結する方法
-
[解決済み] Bashで文字列が部分文字列を含むかどうかをチェックする方法
-
[解決済み] Bashスクリプトからプログラムが存在するかどうかを確認するにはどうすればよいですか?
-
[解決済み] Bashで文字列をデリミターで分割するには?
-
[解決済み] Bashでコマンドの出力に変数を設定するにはどうすればよいですか?
-
[解決済み] Bashで変数が設定されているかどうかを確認する方法は?
-
[解決済み] Bashシェルスクリプトの入力引数の存在確認
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】if [](角括弧)の「[: 引数が多すぎる」エラーの意味)
-
[解決済み】 -bash: 予期しないトークン「改行」付近での構文エラー
-
[解決済み] eval "$(docker-machine env default) "とする。
-
[解決済み] ssh / リモートbashコマンドでシングルクォート文字をエスケープするにはどうすればよいですか?
-
[解決済み] openstack の google-chrome-stable ubuntu12 パッケージが見つかりません。
-
[解決済み] echoコマンドでパイピングが効かない [重複]。
-
[解決済み] Bashを使ってプログレスインジケータを表示する [重複]。
-
[解決済み] bashスクリプトでfindコマンドを使用する
-
[解決済み] IPアドレスのまとめ方
-
[解決済み] Bashスクリプトのset -o pipefailの意味を教えてください。