변수가있는 Bash를 사용하여 여러 줄 문자열을 작성하는 방법은 무엇입니까?


232

myconfig.confBASH를 사용 하는 파일에 여러 줄을 쓰려면 어떻게 해야합니까?

#!/bin/bash
kernel="2.6.39";
distro="xyz";

echo <<< EOL
line 1, ${kernel}
line 2,
line 3, ${distro}
line 4
line ...
EOL >> /etc/myconfig.conf;
cat /etc/myconfig.conf;

답변:


471

구문 ( <<<) 및 사용 된 명령 ( echo)이 잘못되었습니다.

올바른 것입니다 :

#!/bin/bash

kernel="2.6.39"
distro="xyz"
cat >/etc/myconfig.conf <<EOL
line 1, ${kernel}
line 2, 
line 3, ${distro}
line 4 line
... 
EOL

cat /etc/myconfig.conf

이 구성은 Here Document 라고 하며 Bash 매뉴얼 페이지에서 찾을 수 있습니다 man --pager='less -p "\s*Here Documents"' bash.


49
그리고 추가하고 싶다면 고양이가 될 것입니다 >>
또는 Gal

19
이것은 훌륭하게 작동하지만 종료 앞에 공백이 없는지 확인해야합니다 EOF. 그렇지 않으면 인식되지 않으며 예기치 않은 파일 끝 오류가 발생합니다.
nwinkler

10
@StevenEckhoff 이것을 heredoc이라고합니다.
William Pursell

4
파일에 쓰려면 sudo 권한이 필요한 경우 어떻게합니까?
gfpacheco

14
@gfpacheco 고양이처럼 티를 사용할 수 있습니다 << EOL | sudo tee /etc/myconfig.conf
Xin Chen

74
#!/bin/bash
kernel="2.6.39";
distro="xyz";

cat > /etc/myconfig.conf << EOL
line 1, ${kernel}
line 2,
line 3, ${distro}
line 4
line ...
EOL

이것은 당신이 원하는 것을합니다.


6
@ktf 나는 너보다 빠르지 만 글자는 적었다. ^ _ *
Kent

35

변수를 바꾸지 않으려면 EOL을 작은 따옴표로 묶어야합니다.

cat >/tmp/myconfig.conf <<'EOL'
line 1, ${kernel}
line 2, 
line 3, ${distro}
line 4 line
... 
EOL

이전 예 :

$ cat /tmp/myconfig.conf 
line 1, ${kernel}
line 2, 
line 3, ${distro}
line 4 line
... 

14

heredoc 솔루션이 가장 일반적인 방법입니다. 다른 일반적인 솔루션은 다음과 같습니다.

'line 1,' "$ {kernel}" '에코
2 호선
3 행, ' "$ {distro}"'
라인 4 '> /etc/myconfig.conf

exec 3> & 1 # 현재 표준 출력 저장
exec> /etc/myconfig.conf
에코 라인 1, $ {kernel}
에코 라인 2, 
에코 라인 3, $ {distro}
...
exec 1> & 3 # 표준 출력 복원

어쩌면 printf더 흥미로운 변형을 소개하는 것도 있습니다 .
tripleee

3

아래 메커니즘은 여러 줄을 파일로 리디렉션하는 데 도움이됩니다. "변수의 값을 재 지정할 수 있도록 완전한 문자열을 유지하십시오 .

#!/bin/bash
kernel="2.6.39"
echo "line 1, ${kernel}
line 2," > a.txt
echo 'line 2, ${kernel}
line 2,' > b.txt

의 내용 a.txtIS

line 1, 2.6.39
line 2,

의 내용 b.txtIS

line 2, ${kernel}
line 2,
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.