
아래와 같은 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를 추가합니다 ( ).foo
bar
="
"
$
이들 모두는 다음을 변환합니다.
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