bash + bash 스크립트를 통해 파일에서 변수 및 값 읽기

bash + bash 스크립트를 통해 파일에서 변수 및 값 읽기

다음과 같은 파일 변수와 값이 있습니다

# more file.txt
export worker01="sdg sdh sdi sdj sdk"
export worker02="sdg sdh sdi sdj sdm"
export worker03="sdg sdh sdi sdj sdf"

변수를 읽기 위해 소스를 실행합니다.

# source file.txt

예:

echo $worker01
sdg sdh sdi sdj sdk

지금까지 모든게 완벽해

하지만 이제 파일에서 변수를 읽고 간단한 bash 루프를 통해 값을 인쇄하고 싶습니다. 두 번째 필드를 읽고 변수 값을 인쇄해 보겠습니다.

#  for i in ` sed s'/=/ /g'  /tmp/file.txt | awk '{print $2}' `
   do  
   echo $i
   declare var="$i"
   echo $var
   done

하지만 값은 인쇄하지 않고 변수만 인쇄합니다.

worker01
worker01
worker02
worker02
worker03
worker03

예상 출력:

worker01
sdg sdh sdi sdj sdk
worker02
sdg sdh sdi sdj sdm
worker03
sdg sdh sdi sdj sdf

답변1

가 있는 경우 export worker01="sdg sdh sdi sdj sdk"공백 =으로 바꾸면 됩니다 export worker01 "sdg sdh sdi sdj sdk". 공백으로 구분된 필드는 export, worker01, 등 입니다 "sdg.sdh

따옴표를 분할하고 제거하는 것이 더 좋으 =므로 셸을 사용하십시오.

$ while IFS== read -r key val ; do
    val=${val%\"}; val=${val#\"}; key=${key#export };
    echo "$key = $val";
  done < vars
worker01 = sdg sdh sdi sdj sdk
worker02 = sdg sdh sdi sdj sdm
worker03 = sdg sdh sdi sdj sdf

key변수 이름과 val값을 포함합니다. 물론 이는 입력을 실제로 구문 분석하는 것이 아니라 큰따옴표가 있는 경우 이를 제거할 뿐입니다.

답변2

그리고홀로:

awk -F'"' '{print $2}' file.txt
# To print the variable name as well:
awk '{gsub(/[:=]/," "); gsub(/[:"]/,""); if ($1 = "export") {$1=""; print $0}}' file.txt

반복하려면 다음을 수행할 수 있습니다.

for i in "$(awk -F\" '{print $2}' file.txt)"; do
    var="$i"
    echo "$var"
done
my_array=($(awk -F\" '{print $2}' file.txt))
for element in "${my_var[@]}"; do
    another_var="$element"
    echo "$another_var"
done

루프에서 변수 이름도 인쇄하려면 다음을 수행할 수 있습니다.

#! /usr/bin/env bash -
while read -r line; do
    if [[ "$(awk '{print $1}' <<<"$line")" == 'export' ]]; then
        var_name="$(awk '{print $2}' <<<"$line" | awk -F'=' '{print $1}')"
        var_value="$(awk -F\" '{print $2}' <<<"$line")"
        echo -e "${var_name}\n${var_value}"
    else
        continue
    fi
done<file.txt

산출:

$ ./script.sh
worker01
sdg sdh sdi sdj sdk
worker02
sdg sdh sdi sdj sdm
worker03
sdg sdh sdi sdj sdf

답변3

먼저, Perl 호환 정규식을 사용하여 GNU grep 명령으로 변수 이름을 가져올 수 있습니다.

grep -oP 'export \K[^=]+' file.txt

그런 다음 다음을 사용하여 출력을 bash 배열로 읽을 수 있습니다.

mapfile -t variables < <(grep -oP 'export \K[^=]+' file.txt)

Bash 내장 기능 사용mapfile명령과프로세스 교체.

마지막으로 변수 이름을 반복하고 다음을 사용하십시오.간접적인매개변수 확장가치를 얻으세요:

for v in "${variables[@]}"; do 
    printf "varname=%s\tvalue=%s\n" "$v" "${!v}"
done
varname=worker01        value=sdg sdh sdi sdj sdk
varname=worker02        value=sdg sdh sdi sdj sdm
varname=worker03        value=sdg sdh sdi sdj sdf

답변4

이 sed를 사용할 수 있습니다

sed -E 's/[^ ]* ([^=]*)="([^"]*)"/\1\n\2/' file.txt

아니면 이건 좀 이상해

awk -F '"|=' '{split($1,a," ");print a[2]"\n"$3}' file.txt

관련 정보