如何在shell脚本中读取用户的输入并在脚本执行完成后用输入替换一行?

如何在shell脚本中读取用户的输入并在脚本执行完成后用输入替换一行?

我当前有一个脚本,要求用户验证其 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 substitutionsbash 手册中的 以获得更多信息。

相关内容