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

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

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

파일.conf:

key name
value pswd

이제 위의 두 변수를 포함하는 스크립트를 작성하고 싶습니다.

스크립트 파일

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 줄은 기본적으로 첫 번째 필드(세 개 이상인 경우)를 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및 Linux perl에서 -i스위치는 파일을 그 자리에서 편집하고 각 입력 줄을 바꿉니다 s/foo/bar/. 따라서 첫 번째 대체는 첫 번째 공백을 대체하고 두 번째 대체는 줄 끝에 ( )를 추가합니다.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

관련 정보