줄 바꿈이있는 유닉스 변수에 파일 내용


117

다음 내용이 포함 된 텍스트 파일 test.txt가 있습니다.

text1
text2 

그리고 파일의 내용을 UNIX 변수에 할당하고 싶지만 이렇게하면 :

testvar=$(cat test.txt)
echo $testvar

결과는 다음과 같습니다.

text1 text2

대신에

text1
text2 

누군가 나에게 이것에 대한 해결책을 제안 할 수 있습니까?

답변:


185

할당은 개행 문자를 제거 하지 않고 실제로 echo수행합니다. 줄 바꿈을 유지하려면 문자열을 따옴표로 묶어야합니다.

echo "$testvar"

이것은 당신이 원하는 결과를 줄 것입니다. 데모는 다음 내용을 참조하십시오.

pax> cat num1.txt ; x=$(cat num1.txt)
line 1
line 2

pax> echo $x ; echo '===' ; echo "$x"
line 1 line 2
===
line 1
line 2

이유 줄 바꿈은 공백으로 대체 이유가없는 완전히 와 함께 할 echo오히려 사물의 조합이다, 명령.

명령 줄이 주어지면 변수 bash에 대한 문서에 따라 단어로 분할합니다 IFS.

IFS : 확장 후 단어 분할에 사용되는 내부 필드 구분 기호입니다 <space><tab><newline>. 기본값은 .

기본적으로이 세 문자 중 하나를 사용하여 명령을 개별 단어로 분할 할 수 있습니다. 그 후에 단어 구분 기호가 사라지고 남은 것은 단어 목록뿐입니다.

이를 echo문서 ( bash내부 명령) 와 결합 하면 공백이 출력되는 이유를 알 수 있습니다.

echo [-neE] [arg ...] : 인자를 공백으로 구분하고 그 뒤에 줄 바꿈을 출력합니다.

를 사용 echo "$x"하면 전체 x변수가 에 따라 단일 단어가 bash되므로 분할되지 않습니다. 다음과 같이 확인할 수 있습니다.

pax> function count {
...>    echo $#
...> }
pax> count 1 2 3
3
pax> count a b c d
4
pax> count $x
4
pax> count "$x"
1

여기에서 count함수는 주어진 인수의 수를 간단히 출력합니다. 1 2 3및 a b c d변종 행동을 보여줍니다.

그런 다음 x변수 에 대한 두 가지 변형으로 시도합니다 . 한 없이 네 개의 단어가 있다는 것을 인용 쇼, "test", "1", "test"와 "2". 따옴표를 추가하면 만들어 하나 하나 개의 단어 "test 1\ntest 2".


따옴표 ... 그게 내가 놓친 것입니다! 감사!
— anonymite

또한 주목할 가치가 있습니다. 후행 줄 바꿈은 명령 대체 연산자 자체에 의해 제거됩니다. 온라인으로 시도하십시오!
— 요나

11

이는 줄 바꿈을 포함 하는 IFS (Internal Field Separator) 변수 때문입니다.

$ cat xx1
1
2

$ A=`cat xx1`
$ echo $A
1 2

$ echo "|$IFS|"
|       
|

해결 방법은 임시로 줄 바꿈을 포함하지 않도록 IFS를 재설정하는 것입니다 .

$ IFSBAK=$IFS
$ IFS=" "
$ A=`cat xx1` # Can use $() as well
$ echo $A
1
2
$ IFS=$IFSBAK

IFS에 대한이 끔찍한 변화를 되돌리려면 :

IFS=$IFSBAK

이 변경을 수행했지만 이제 다른 작업이 작동하지 않습니다. 다시 설정하라고 알려주세요.
— Pooja25

변수로 이동하는 데 필요하지 않은 경우 직접 한 echo "$(IFS=''; cat text.txt)"
— 줄로


3

누군가 다른 옵션에 관심이있는 경우 :

content=( $(cat test.txt) )

a=0
while [ $a -le ${#content[@]} ]
do
        echo ${content[$a]}
        a=$[a+1]
done

3

에 의해 변수가 올바르게 설정되었습니다 testvar=$(cat test.txt). 줄 바꾸기 문자로 구성된이 변수를 표시하려면 큰 따옴표를 추가하십시오.

echo "$testvar" 

다음은 전체 예입니다.

$ printf "test1\ntest2" > test.txt
$ testvar=$(<test.txt)
$ grep testvar <(set)
testvar=$'test1\ntest2'
$ echo "$testvar"
text1
text2
$ printf "%b" "$testvar"
text1
text2

0

이 envdir유틸리티는이를 수행하는 쉬운 방법을 제공합니다. envdir파일을 사용하여 환경 변수를 나타내며 파일 이름은 env var 이름에 매핑되고 파일 내용은 env var 값에 매핑됩니다. 파일 내용에 줄 바꿈이 포함되어 있으면 env var도 마찬가지입니다.

참조 https://pypi.python.org/pypi/envdir를

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