나는 가지고있다
SA_PASSWORD=Password1!
파일에서 테스트/.makefile_test_env. 내 bash 쉘의 변수에 "Password1!" 값을 가져오고 싶습니다. 나는 이것을 시도했다
$ MY_VAR=$(grep SA_PASSWORD tests/.makefile_test_env | xargs)
불행히도 이것은 반환됩니다
$ echo $MY_VAR
SA_PASSWORD=Password1!
"SA_PASSWORD=" 부분을 필터링하는 방법은 무엇입니까?
답변1
명령을 통해 이를 수행할 수 있지만 cut
스크립트에 비밀번호를 남겨 두는 것은 아마도 좋은 생각이 아니라는 점을 명심하십시오.
[ekaj@headdesk ~]$ cat vars
SA_PASSWORD=Password1!
[ekaj@headdesk ~]$ cat setvar.sh
#!/bin/bash
echo "MY_VAR is currently set to: $MY_VAR"
MY_VAR=$(grep SA_PASSWORD ./vars | cut -d'=' -f 2-)
echo "MY_VAR is currently set to: $MY_VAR"
[ekaj@headdesk ~]$
[ekaj@headdesk ~]$ ./setvar.sh
MY_VAR is currently set to:
MY_VAR is currently set to: Password1!
[ekaj@headdesk ~]$
-f 2-
첫 번째 필드 이후의 모든 필드를 인쇄합니다 =
. 이는 비밀번호에 등호가 있는 경우 유용할 수 있습니다.
답변2
거의 다 완성했습니다. 확장 정규식과 뒤돌아보기 모드를 사용해 보세요(그리고 파이프도 필요하지 않습니다 xargs
).
MY_VAR=$(grep -Po '(?<=SA_PASSWORD=).*' tests/.makefile_test_env)
이것은 말한다:
- "MY_VAR"이라는 쉘 변수를 생성하고 $()에 있는 내용으로 설정합니다. 즉...
- grep은
-P
perl 정규식을 사용하고-o
'...' 패턴과 일치하는 항목만 반환합니다. 즉, (?<=SA_PASSWORD=).*
이는 문자를 여러 번 일치시키는 것을 의미합니다. 단, 첫 번째 문자 앞의 문자가.*
"SA_PASSWORD="이고 일치 항목에 포함되지 않는 경우에만 해당됩니다.(?<=)
.
답변3
변수 이름이 중요하지 않다면 괜찮습니다 source
.
source tests/.makefile_test_env
echo $SA_PASSWORD # Prints Password1!
경고하다: 신뢰할 수 없는 파일에 대해 소스 작업을 수행하는 것은 위험합니다. 당신은 쉘 스크립트를 실행하고 있으며 스크립트는 당신이 스스로 할 수 있는 모든 것을 할 수 있습니다.