다음과 같은 값을 갖는 변수가 있습니다
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
. 그런 다음 declare
변수를 설정하기 위해 bash 명령과 함께 사용하기에 적합한 출력을 생성합니다 .
이 줄에서는 큰따옴표를 사용하지 않으며 사용해서 도 $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