
다음과 같은 값을 갖는 변수가 있습니다.
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
쉼표를 기준으로 변수를 여러 조각으로 나눕니다. 두 번째 줄은 안쪽에서 바깥쪽으로 작업합니다.
- 첫 번째 값(예: 'dog'), 등호, 두 번째 두 값을 출력합니다.
1
등호가 붙은 첫 번째 값을 출력한 다음 두 번째 값을 출력합니다 .- 첫 번째 값 뒤에
2
등호가 붙은 다음 세 번째 값을 출력합니다. 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
. 예: . 필요한 경우 스크립트의 print
및 printf
문 에서 적절한 인용을 출력하여 이 문제를 해결할 수 있습니다 perl
. 및/또는 $newline
문자열 대신 bash 배열로 정의합니다. 여기에서 사용되는 원리/기술을 이미 충분히 보여주었으므로 독자를 위한 연습용으로 남겨둡니다.
내보낸 변수로 선언하려면 다음을 사용하십시오.
declare -x $newline
help declare
자세한 내용은 참조하세요 .
그런데 에서는 대신 ksh
사용할 수 있습니다 . 에서도 지원되지만 더 이상 사용되지 않는 것으로 간주됩니다( 참조 ) .typeset
declare
typeset
bash
help typeset
bash
마지막으로, 별도의 변수 대신 쉘 배열 변수(예 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