現在、ユーザーがOAuth資格情報を確認し、リフレッシュトークンを返すように要求するスクリプトがあります。ユーザーがリフレッシュトークンを直接入力する必要があるのは面倒です。ファイルを自動的に編集し、リフレッシュトークンがない場合は、リフレッシュする方法があると思います。たとえば、
#!/bin/bash
REFRESH_TOKEN=
if [ -z "$REFRESH_TOKEN" ]; then
(opens a webpage for the user to authenticate themselves)
(we then pull the refresh token programmatically and set it)
REFRESH_TOKEN=$(some api call)
fi
ユーザーがREFRESH_TOKEN
変数を空の状態でこのコマンドを実行している場合、リアルタイムまたは実行後に2番目の行を更新する方法はありますか?試してみましたが、やはり影響をsed
受けて動作しません REFRESH_TOKEN=$(some api call)
。
答え1
質問を誤解しないsed
限り、正規表現を追加して^
囲む$
限り機能します。例えば
sed 's/^REFRESH_TOKEN=$/REFRESH_TOKEN={token}/g'
REFRESH_TOKEN=
行内の唯一の項目のみが一致するため、動作します。そのREFRESH_TOKEN=$(some api call)
部分はそれに続く項目の影響を受けてはいけません。=
次のようにsedの範囲を制限することもできますが、
sed '2 s/REFRESH_TOKEN=/REFRESH_TOKEN={token}/g'
これは次の場合にのみ良い解決策です。確認する交換する必要がある行は常に2行です。
答え2
REFRESH_TOKEN=$(some api call)
sed '2 s/^REFRESH_TOKEN=.*/REFRESH_TOKEN='"$REFRESH_TOKEN/" -i "$0"
ここでは、sedにスクリプトの2行だけを変更するように具体的に指示します。
または、2の代わりに行番号を含む範囲を使用できます。
sed '1,5 s/
...
またはパターン
sed '1,/^#END-OF-SETTINGS-MARKER#/ s/
...
答え3
次の行は bash スクリプトのロジックをカプセル化します。
: ${REFRESH_TOKEN:="$(some api call)"}
これが行うことは、以前に行われなかった場合にのみ更新トークン変数を初期化することです。初期値はWeb API呼び出しを実行して取得されます。
bash parameter substitutions
詳細についてはbashのマニュアルを読んでください。