xyz.cfg
다음 값을 가진 구성 파일이 있습니다
NewYork|US|NewYork_${CUT_NO}_
Delhi|INDIA|Delhi_${CUT_NO}_
housekeeping.sh
전역 변수가 포함된 스크립트가 있습니다.
CUT_NO=001
그리고 나는 파일을 while
읽고 있습니다 .xyz.cfg
그러나 그 줄을 읽은 후에 ${CUT_NO}
는 교체되지 않았습니다 .
o/p는 그래야 NewYork_001_
하지만 알겠습니다 NewYork_${CUT_NO}_
.
답변1
sed
파일의 자리 표시자를 변수 값으로 바꾸는 데 사용됩니다 .
sed "s/\${CUT_NO}/$CUT_NO/" xyz.cfg
|
그런 다음 -구분된 출력을 읽으십시오 sed
.
sed "s/\${CUT_NO}/$CUT_NO/" xyz.cfg |
while IFS='|' read c1 c2 c3; do
printf 'Column 3 has value "%s"\n' "$c3"
done
또는
sed "s/\${CUT_NO}/$CUT_NO/" xyz.cfg |
awk -F '|' '{ printf("Column 3 has value \"%s\"\n", $3) }'
또는 그런 것.
이로 인해
Column 3 has value "NewYork_001_"
Column 3 has value "Delhi_001_"
파일의 쉘 변수는 스크립트의 변수 값으로 대체되지 않으면 다른 텍스트처럼 읽혀집니다. 그것이 당신이 얻는 이유입니다 NewYork_${CUT_NO}_
.
이를 수행하는 또 다른 방법은 문자열을 전달하고 NewYork_${CUT_NO}_
( eval printf '%s\n' "$c3"'
문자열이 다음과 같이 저장된 경우 $c3
) 값을 다시 c3
새 변수에 할당하는 것입니다. 그러나 eval
이는 일반적으로 사용자 제공 데이터를 평가하는 데 안전하지 않은 것으로 간주됩니다(예: 마지막 열에 가치가 있다고 가정) NewYork_${CUT_NO}_;ls -l
또는 더 위험한 것).