다음과 같은 파일 변수와 값이 있습니다
# 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