shell - 읽어오기 - 쉘에서 변수로 파일을 읽는 방법?



쉘 스크립트 파일 읽기 변수 저장 (4)

이 작품은 나를 위해 : v=$(cat <file_path>) echo $v

https://src-bin.com

파일을 읽고 변수에 저장하고 싶지만 파일을 인쇄하지 않고 변수를 유지해야합니다. 어떻게해야합니까? 이 스크립트를 작성했지만 필요한 것은 아닙니다.

#!/bin/sh
while read LINE  
do  
  echo $LINE  
done <$1  
echo 11111-----------  
echo $LINE  

스크립트에서 파일 이름을 매개 변수로 지정할 수 있습니다. 예를 들어 파일에 "aaaa"가 들어 있으면 다음과 같이 인쇄됩니다.

aaaa
11111-----

그러나 이것은 단지 파일을 화면에 출력하고, 변수에 저장하고 싶습니다! 이 작업을 수행하는 쉬운 방법이 있습니까?


Answer #1

전체 파일을 변수로 읽으려면 다음을 수행하십시오.

#!/bin/bash
value=`cat sources.xml`
echo $value

한 줄씩 읽으려면 다음과 같이하십시오.

while read line; do    
    echo $line    
done < file.txt

Answer #2

두 가지 중요한 함정

지금까지는 다른 답변에 의해 무시되었습니다 :

  1. 명령 확장에서 줄 바꿈 제거
  2. NUL 문자 제거

명령 확장에서 줄 바꿈 제거

이것은 다음에 대한 문제입니다.

value="$(cat config.txt)"

read 솔루션은 아닙니다.

명령 확장은 후미 줄 바꿈을 제거합니다.

S="$(printf "a\n")"
printf "$S" | od -tx1

출력 :

0000000 61
0000001

이것은 파일로부터 순진하게 읽는 방법을 깬다.

FILE="$(mktemp)"
printf "a\n\n" > "$FILE"
S="$(<"$FILE")"
printf "$S" | od -tx1
rm "$FILE"

POSIX 임시 해결책 : 명령 확장에 여분의 문자를 추가하고 나중에 제거하십시오 :

S="$(cat $FILE; printf a)"
S="${S%a}"
printf "$S" | od -tx1

출력 :

0000000 61 0a 0a
0000003

POSIX의 거의 해결책 : ASCII 인코딩. 아래를 참조하십시오.

NUL 문자 제거

변수에 NUL 문자를 저장하는 것은 당연한 Bash 방법이 아닙니다 .

이것은 확장 및 read 솔루션에 모두 영향을 미치며 좋은 해결 방법을 모릅니다.

예:

printf "a\0b" | od -tx1
S="$(printf "a\0b")"
printf "$S" | od -tx1

출력 :

0000000 61 00 62
0000003

0000000 61 62
0000002

하, 우리 NUL은 없어 졌어!

해결 방법 :

  • ASCII 인코딩. 아래를 참조하십시오.

  • bash 확장자를 사용합니다. $"" literal :

    S=$"a\0b"
    printf "$S" | od -tx1
    

    리터럴에서만 작동하므로 파일에서 읽기에는 유용하지 않습니다.

함정에 대한 해결 방법

변수에 파일의 uuencode base64로 인코딩 된 버전을 저장하고 모든 사용법 전에 디코딩하십시오.

FILE="$(mktemp)"
printf "a\0\n" > "$FILE"
S="$(uuencode -m "$FILE" /dev/stdout)"
uudecode -o /dev/stdout <(printf "$S") | od -tx1
rm "$FILE"

산출:

0000000 61 00 0a
0000003

uuencode와 udecode는 POSIX 7 이지만 기본적으로 우분투 12.04에는 포함되어 있지 않습니다 ( sharutils 패키지) ... 다른 파일에 쓰는 것을 제외하고는 bash 프로세스 <() 대체 확장을위한 POSIX 7 대안이 없습니다 ...

물론, 이것은 느리고 불편합니다. 따라서 실제 대답은 다음과 같습니다. 입력 파일에 NUL 문자가 포함되어있을 경우 Bash를 사용하지 마십시오.


Answer #3

Ciro Santilli가 명령 대체를 사용하면 명령 줄 바꿈 줄이 사라집니다. 후행 문자를 추가하는 방법은 대단한데, 꽤 오랜 시간 동안 사용한 후에는 명령 대체를 전혀 사용하지 않은 솔루션이 필요하다고 결정했습니다.

필자의 접근 방식 은 stdin의 내용을 변수에 직접 읽어 들이기 위해 printf 내장 함수의 -v 플래그 와 함께 read 를 사용한다.

# Reads stdin into a variable, accounting for trailing newlines. Avoids needing a subshell or
# command substitution.
read_input() {
  # Use unusual variable names to avoid colliding with a variable name
  # the user might pass in (notably "contents")
  : "${1:?Must provide a variable to read into}"
  if [[ "$1" == '_line' || "$1" == '_contents' ]]; then
    echo "Cannot store contents to $1, use a different name." >&2
    return 1
  fi

  local _line _contents
   while read -r _line; do
     _contents="${_contents}${_line}"$'\n'
   done
   _contents="${_contents}${_line}" # capture any content after the last newline
   printf -v "$1" '%s' "$_contents"
}

이것은 후미 줄 바꿈이 있거나없는 입력을 지원합니다.

사용 예 :

$ read_input file_contents < /tmp/file
# $file_contents now contains the contents of /tmp/file




sh