단일 변수에서 여러 변수 할당에 해당하는 텍스트 생성

단일 변수에서 여러 변수 할당에 해당하는 텍스트 생성

다음과 같은 값을 갖는 변수가 있습니다.

line=dog,/path1,/path2

내가 원하는 것은 값에서 변수를 만드는 것입니다. 즉 dog, 변수여야 하며 아래 출력을 얻고 싶습니다.

dog=/path1,/path2
dog1=/path1
dog2=/path2

마찬가지로 내가 가지고 있다면 line=bull,/val1,/val2아래 출력이 필요합니다.

bull=/val1,/val2
bull1=/val1
bull2=/val2

쉼표로 구분된 값 은 line세 개만 있습니다.

답변1

나는 그것이 당신이하려는 일이라고 생각합니다 :

line='dog,/path1,/path2'
IFS=', ' read -r -a dog <<< "$line"

echo "$dog"
dog
echo "${dog[1]}"
/path1
echo "${dog[2]}"
/path2 

이는 쉘이 bash라고 가정합니다.

답변2

Bash 중심 솔루션은 다음과 같습니다.

IFS=, read -r -a vars <<<"$line"
printf "%s\n" "${vars[0]}=${vars[1]},${vars[2]}" "${vars[0]}1=${vars[1]}" "${vars[0]}2=${vars[2]}"

첫 번째 줄은 $line쉼표를 기준으로 변수를 여러 조각으로 나눕니다. 두 번째 줄은 안쪽에서 바깥쪽으로 작업합니다.

  1. 첫 번째 값(예: 'dog'), 등호, 두 번째 두 값을 출력합니다.
  2. 1등호가 붙은 첫 번째 값을 출력한 다음 두 번째 값을 출력합니다 .
  3. 첫 번째 값 뒤에 2등호가 붙은 다음 세 번째 값을 출력합니다.
  4. printf줄 바꿈으로 구분된 세 개의 문자열입니다.

이 답변은 귀하의 질문에 따라 $line.

샘플 입력 및 출력(앞부분 $은 쉘 프롬프트임):

$ line=dog,/path1,/path2
$ IFS=, read -r -a vars <<<"$line"
$ printf "%s\n" "${vars[0]}=${vars[1]},${vars[2]}" "${vars[0]}1=${vars[1]}" "${vars[0]}2=${vars[2]}"
dog=/path1,/path2
dog1=/path1
dog2=/path2

printf 출력을 파일로 쉽게 리디렉션할 수 있습니다.

답변3

를 사용하는 경우 bash다음과 같이 수행할 수 있습니다( echo각 단계에서 무슨 일이 일어나는지 보여주는 추가 명령문 사용).

$ line=dog,/path1,/path2

$ newline=$(printf "%s\n" "$line" | 
            perl -n -e 'BEGIN {$count=1};
                        my ($var,@values) = split /,/;
                        print "$var=" . join(",",@values);
                        foreach (@values) {
                            printf "%s%i=\"%s\" ",$var, $count++, $_
                        }')

$ echo "$newline"
dog=/path1,/path2 dog1=/path1 dog2=/path2

$ declare $newline

$ declare | grep '^dog'
dog=/path1,/path2
dog1=/path1
dog2=/path2

perl쉼표로 나누는 데 사용됩니다 $line. 첫 번째 필드는 에 저장되고 $var나머지는 이라는 배열에 저장 됩니다 @values. 그런 다음 변수를 설정하기 위해 bash declare명령과 함께 사용하기에 적합한 출력을 생성합니다.

$newline줄에서 큰따옴표를 사용해서는 안 됩니다 declare. 큰따옴표로 묶인 경우 declare공백으로 구분된 세 개의 인수가 아닌 하나의 인수만 가져옵니다.

여기에 인용이 부족하여 발생하는 불쾌한 부작용 중 하나는declare 할 것이다필드 값에 공백 문자 등이 포함되어 있으면 실패합니다 line=dog,/path /with / spaces,/path2. 예: . 필요한 경우 스크립트의 printprintf문 에서 적절한 인용을 출력하여 이 문제를 해결할 수 있습니다 perl. 및/또는 $newline문자열 대신 bash 배열로 정의합니다. 여기에서 사용되는 원리/기술을 이미 충분히 보여주었으므로 독자를 위한 연습용으로 남겨둡니다.

내보낸 변수로 선언하려면 다음을 사용하십시오.

declare -x $newline

help declare자세한 내용은 참조하세요 .

그런데 에서는 대신 ksh사용할 수 있습니다 . 에서도 지원되지만 더 이상 사용되지 않는 것으로 간주됩니다( 참조 ) .typesetdeclaretypesetbashhelp typesetbash


마지막으로, 별도의 변수 대신 쉘 배열 변수(예 dog[0]=/path1,/path2: dog[1]=/path1, 및 ) 를 사용하는 것을 선호하지 않으시겠습니까 ? dog[2]=/path2이것이 바로 그들이 존재하는 이유입니다.

답변4

당신은 이런 일을 할 수 있습니다. 나는 당신이 가지고 있는 선을 정의합니다. 다음으로, 줄에서 쉼표로 구분된 첫 번째 토큰을 구문 분석합니다(여기서는 변수 이름에 유효하다고 가정합니다). 그런 다음 첫 번째 토큰을 기반으로 두 개의 새 변수를 생성하고 이를 줄에서 쉼표로 구분된 두 번째 및 세 번째 토큰에 할당합니다.

line="dog,/path1,/path2"
first="$(echo "${line}" | awk -F, '{ print $1 }')"
eval "${first}1=$(echo "${line}" | awk -F, '{ print $2 }')"
eval "${first}2=$(echo "${line}" | awk -F, '{ print $3 }')"

echo "${dog1}"
/path1
echo "${dog2}"
/path2

관련 정보