파일에서 변수를 어떻게 읽습니까?


68

텍스트 파일에서 읽을 값 (문자열)을 스크립트에 삽입하고 싶습니다.

예를 들어,

echo "Enter your name"
read name

다른 텍스트 파일에서 문자열을 읽으려면 인터프리터가 사용자 입력이 아닌 파일에서 문자열을 읽어야합니다.


1
텍스트 파일은 어떻게 생겼습니까? 전체 파일 1이 가변적입니까, 아니면 KEY=VALUE쌍입니까? 해결책은 상당히 다릅니다 (후자 인 경우 Takkat의 답변이 적용됩니다, 이전 Radu의 경우)
kiri

1
@CiroSantilli 다른 사용자가 게시 한 경우 교차 게시되지 않으며 "사이트 간 복제"와 같은 것은 없습니다. 피해야 할 유일한 것은 다른 사이트 의 동일한 사용자가 묻는 동일한 질문 입니다.
terdon

답변:


98

파일에서 변수를 읽으려면 sourceor .명령을 사용할 수 있습니다 .

파일이 다음 줄을 포함한다고 가정하자

MYVARIABLE="Any string"

다음을 사용하여이 변수를 가져올 수 있습니다

#!/bin/bash

source <filename>
echo $MYVARIABLE

16
이런 식으로 그렇게하고 싶지 않은 이유 중 하나는에있는 모든 것이 <filename>쉘에서 실행될 것 rm -rf /입니다.
Mark Ribau

3
파티에 늦었지만, 아니요, 또는 답변으로 마크 업할 자격이 없습니다. 이것은 OP가 요청한 것이 아닌 다른 bash 소스 파일을 제공합니다. 그는 FILE의 내용을 변수로 읽는 방법을 물었습니다. 변수설정하는 다른 스크립트를 실행하는 방법이 아닙니다 . 정답은 다음과 같습니다. name = $ (cat "$ file").
HörmannHH

2
OTOH, 내가 Google에 요청한 질문에 대한 대답이며 Google이 나를 여기로 데려 왔습니다. 이상한 시간, 어?
Michael Terry

1
여러 변수에 적합합니다! @MarkRibau의 요점은 이해되지만 다른 스크립트에서 파일을 올바르게 작성하고 파일을 정밀하고 통제력이 넘겨야한다고 생각합니다.
madlymad

1
당신이 사용할 수있는 sed추가 local키워드를하고 스크립트가 조금 더 안전하고 글로벌 범위를 polute 없습니다. 따라서 함수 내부에서 수행 cat global_variables.sh | sed -e 's/^/local /' > local_variables.sh한 다음을 사용하십시오 . ./local_variables.sh. 함수에서 가져 오는 것은 무엇이든 해당 함수에서만 사용할 수 있습니다. global_variables.sh행당 하나의 변수 만 포함 한다고 가정 합니다.
Nux

55

텍스트 파일의 모든 내용을 변수에 유지하려는 경우 다음을 사용할 수 있습니다.

#!/bin/bash

file="/path/to/filename" #the file where you keep your string name

name=$(cat "$file")        #the output of 'cat $file' is assigned to the $name variable

echo $name               #test

또는 순수한 배쉬에서 :

#!/bin/bash

file="/path/to/filename"     #the file where you keep your string name

read -d $'\x04' name < "$file" #the content of $file is redirected to stdin from where it is read out into the $name variable

echo $name                   #test

변수를 표시하고 싶지 않습니다. 추가 처리를 위해 스크립트에서이 변수를 읽어야합니다. 나는 한 줄씩 읽는 awk를 시도했다.
user208413

1
좋아, 삭제하십시오 echo $name . 테스트 용으로 만 사용합니다. 다음으로 $name스크립트에서 원하는 곳 어디에서나 추가 처리를 위해 변수를 사용할 수 있습니다 .
Radu Rădeanu

dhe 스크립트가 변수의 값을 모르기 때문에 스크립트 어디에서나 사용할 수 없습니다. 우리의 경우 변수 이름.
user208413

6
@ user208413 variable의 값은 command를 $name사용하여 지정된 파일의 문자열입니다 cat $file. 명확하지 않거나 이해하기 어려운 것은 무엇입니까?
Radu Rădeanu

1
그것은 별도의 사용하는 중복의 $file경우에만로드 한 번 사용하는 경우 변수를 $name변수를 바로 사용cat /path/to/file
키리

11

스크립트 내에서 다음을 수행 할 수 있습니다.

read name < file_containing _the_answer

루프에서 여러 번 할 수도 있습니다.

while read LINE; do echo "$LINE"; done < file_containing_multiple_lines

또는 각 줄에 여러 항목이있는 파일의 경우. . . grep -v ^ # 파일 | abc를 읽는 동안; 에코 수행 a = $ ab = $ bc = $ c; 수행
gaoithe

7

이를 수행하는 한 가지 방법은 표준 입력을 파일로 리디렉션하는 것입니다. 여기서 모든 사용자 입력은 프로그램에서 예상 한 순서대로 수행됩니다. 예를 들어, 프로그램 (라고 script.sh)

#!/bin/bash
echo "Enter your name:"
read name
echo "...and now your age:"
read age

# example of how to use the values now stored in variables $name and $age
echo "Hello $name. You're $age years old, right?"

입력 파일 ( input.in)

Tomas
26

다음 두 가지 방법 중 하나로 터미널에서이를 실행할 수 있습니다.

$ cat input.in | ./script.sh
$ ./script.sh < input.in

스크립트를 실행하고 수동으로 데이터를 입력하는 것과 같습니다. "Hello Tomas. 26 세입니다. 맞습니까?"

으로 라두 Rădeanu가 있다 이미 제안 , 당신은 사용할 수 catavariable에 파일의 내용을 읽어 스크립트 내부 -이 경우, 당신은 당신이 특정 변수에 대해 원하는 유일한 값으로, 하나의 라인을 포함하는 각 파일이 필요합니다. 위의 예에서, 당신은 이름을 가진 하나 (예를 들어,에 입력 파일을 분할 것 name.in)과 연령 (예를 들어, 하나 age.in), 그리고 변화 read nameread age에 라인을 name=$(cat name.in) 그리고 age=$(cat age.in)각각.


vh = awk "NR == 3 {print; exit}"/var/www/test/test.txt 스크립트가 있는데 test.txt라는 텍스트 파일에서 3 행을 읽습니다. 문자열을 받으면이 문자열을 디렉토리를 만들기위한 입력으로 사용하려고합니다.
user208413

1
로 변경하십시오 vh=$(awk "NR==3 {print;exit}" /var/www/test.txt). 그런 다음 문자열을 variable에 저장하면 다음 $vh과 같이 사용할 수 있습니다 mkdir "/var/www/$vh".-/ var / www 안에 지정된 이름의 폴더가 만들어집니다.
Tomas Aschan

이 방법을 수행했지만 여전히 폴더를 만들 수 없습니다 :(
user208413

@ user208413 : 어떤 오류 메시지가 나타 납니까? "작동하지 않습니다"는 불행히도 매우 유용한 문제 설명이 아닙니다 ...
Tomas Aschan


3
name=$(<"$file") 

에서 man bash:1785,이 명령의 대체에 해당 name=$(cat "$file")하지만, 빨리.



0

여러 문자열을 사용하려면 다음을 수행하십시오.

path="/foo/bar";
for p in `cat "$path"`;
do echo "$p" ....... (here you would pipe it where you need it) 

또는

사용자가 파일을 표시하도록하려면

read -e "Specify path to variable(s): " path;
for p in 'cat "$path"';
do echo "$p" ............................

0
#! /bin/bash
#  (GPL3+) Alberto Salvia Novella (es20490446e)


variableInFile () {
    variable=${1}
    file=${2}

    source ${file}
    eval value=\$\{${variable}\}
    echo ${value}
}


variableInFile ${@}

0

이것을 사용하여 파일에서 단일 변수를 얻습니다.

GET_VAR=$(grep --color=never -Po "^${GET_VAR}=\K.*" "${FILE}" || true)

경우 GET_VAR에없는 ${FILE}것이 오히려에 오류 감사를 일으키는 것보다 비어 있습니다 || true.

그것은 사용하는 grep -PGNU의 그렙에 있지만이 글을 쓰는 시점에서 모든 그렙의 기본은없는.


이것은 나를 위해 작동하지 않는 것 같습니다. 초기 $는 불법 문자에 대한 오류를 발생
시킵니다
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.