아래와 같이 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/
. 따라서 첫 번째 대체는 첫 번째 공백을 대체하고 두 번째 대체는 줄 끝에 ( )를 추가합니다.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