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


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 name와 read 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.