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


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 3a 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.