파일의 문자열을 변수로 사용하는 방법

파일의 문자열을 변수로 사용하는 방법

아래와 같은 conf 파일 내용이 있습니다.

파일.conf:

key name
value pswd

이제 위와 같이 두 개의 변수를 갖는 스크립트를 작성하고 싶습니다.

script.sh

key="name"      #key as variable
value="pswd"    #value as variable

. /path/to/file.conf키 및 값 명령을 찾을 수 없음 오류가 발생했습니다.

답변1

노력하다

 awk 'NF>1 { var=$1 ; $1 = "" ; printf "%s=\"%s\"\n",var,$0; }' file.conf > script.sh

이 awk 줄은 기본적으로 첫 번째 파일(2개 이상인 경우)을 var 이름으로 사용하고 나머지 줄을 값으로 사용합니다(따라서 $1=""더티 트릭).

Terdon 제안에 따라 제공된 값에는 공백이 없습니다.

 awk '{print $1 "=" $2 }' file.conf > script.sh

답변2

쉘이 Bourne 스타일이고 변수가 var="value"GNU 로 정의되어 있다고 가정하면 sed다음을 수행할 수 있습니다.

sed -i 's/ /="/;s/$/"/' file.conf

또는

sed -i -e 's/ /="/' -e 's/$/"/' file.conf

또는

perl -i -pe 's/ /="/;s/$/"/' file.conf

이것들은 기본적으로 모두 같은 생각입니다. GNU와 에서 sed스위치 perl-i파일을 제자리에서 편집하고 모든 입력 행에서 로 s/foo/bar/대체합니다 . 따라서 첫 번째 대체는 첫 번째 공백을 다음으로 대체 하고 두 번째 대체는 줄 끝에 a를 추가합니다 ( ).foobar=""$

이들 모두는 다음을 변환합니다.

key name
value pswd
key1 foo bar

이에:

key="name"
value="pswd"
key1="foo bar"

답변3

나는 당신이 원하는 것을 조금 다르게 해석했습니다. 즉, 마치 file.conf쉘 변수 할당 세트인 것처럼 소싱하는 방법을 원한다는 것입니다.

. /path/to/file.conf

사용해 보세요

eval `while read var val; do echo "${var}='${val}'"; done < /path/to/file.conf`

file.conf형식이 여기에 설명된 내용에서 벗어나지 않았는지 확인해야 합니다 .

루프 내의 각 할당에 대해 eval을 호출하는 대신 의도적으로 전체 출력에 대해 eval을 사용하고 있습니다. 변수 할당이 전역적으로 적용되는지 확실하지 않기 때문입니다(리디렉션된 입력으로 인해 하위 셸에서 수행될 수 있음). - 확실히 아는 사람 있나요? 그냥 테스트해볼 수도 있을 것 같아요 :-)

답변4

$큰 따옴표는 , , "백슬래시 및 백틱 문자가 여전히 특별하기 때문에 가장 좋은 따옴표 선택이 아닐 수 있습니다 .

대신에 작은따옴표 문자( )를 사용하겠습니다. key='name'그러면 걱정해야 할 유일한 문자는 '그 자체이기 때문입니다.

sed "s/'/'\\\\''/g;s/ /='/;s/\$/'/" < file.conf > file.sh

관련 정보