我当前有一个脚本,要求用户验证其 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
变量为空的情况下运行此命令,是否有办法实时或执行后更新第二行?我已经尝试过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 手册中的 以获得更多信息。