쉘 스크립트에서 사용자 입력을 읽고 스크립트 실행이 완료된 후 줄을 입력으로 바꾸는 방법은 무엇입니까?

쉘 스크립트에서 사용자 입력을 읽고 스크립트 실행이 완료된 후 줄을 입력으로 바꾸는 방법은 무엇입니까?

현재 사용자가 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 매뉴얼을 읽어보세요 .

관련 정보