다음과 같은 문자열이 주어지면:
NAME="bla" TYPE="test" SIZE="10"
각 쌍의 값을 별도의 쉘 스크립트 변수에 넣고 싶습니다. 예를 들어 세 개의 변수가 있고 첫 번째 변수에 bla 값을 로드하고 두 번째 변수에서 테스트하고 세 번째 변수에서 10을 로드한다고 가정해 보겠습니다.
name=bla
type=test
size=10
내가 지금까지 시도한 것 :
echo \"NAME=\"bla\" TYPE=\"test\" SIZE=\"10\"" | awk '{print Var, $1}'
그러나 이는 값뿐만 아니라 전체 키-값 쌍을 반환합니다. sed나 awk를 사용하여 이를 수행할 수 있는 좋은 방법이 있습니까?
답변1
반드시 권장하지는 않지만 문자열에 포함된 내용과 와일드카드 문자 등이 포함되지 않은 내용을 완전히 제어할 수 있는 경우 다음을 수행할 수 있습니다.
$ cat tst.sh
#!/usr/bin/env bash
str='NAME="bla" TYPE="test" SIZE="10"'
declare $str
echo "NAME=$NAME"
echo "TYPE=$TYPE"
echo "SIZE=$SIZE"
$ ./tst.sh
NAME="bla"
TYPE="test"
SIZE="10"
$ cat tst.sh
#!/usr/bin/env bash
str='NAME="bla" TYPE="test" SIZE="10"'
declare ${str,,}
echo "name=$name"
echo "type=$type"
echo "size=$size"
$ ./tst.sh
name="bla"
type="test"
size="10"
답변2
나는 이 솔루션을 제안합니다:
$ string='NAME="bla" TYPE="test" SIZE="10"'
$ IFS=' ' read -a a <<< "$string"
for i in "${a[@]}"; do
var="${i%%=*}"
value="${i##*=}"
declare "${var,,}"="${value//\"/}"
done
그 다음에
$ echo $name
bla
$ echo $type
test
$ echo $size
10
답변3
이미 더 나은 답변( )이 있지만 declare $str
여기에는 다른 옵션을 남겨 두겠습니다.
그리고 source
:
source <(echo 'NAME="bla" TYPE="test kkk" SIZE="10"')
그리고 eval
:
eval 'NAME="bla" TYPE="test kkk" SIZE="10"'
둘 다 매개변수 이스케이프와 공백(예 SIZE="with a space"
: )을 처리합니다.
단, 둘 다 매개변수 확장 대상입니다. SIZE="*"
또는 SIZE="$(hostname)"
확장/작동됩니다.
답변4
확실하지는 않지만 값을 다른 변수에 저장하려면 다음을 수행할 수 있습니다.
echo "NAME="bla" TYPE="test" SIZE="10"" | tr ' ' '\n' | while read line
do
#this will give you the value. save it in any variable you want.
name=$(echo $line | awk -F= '{print $2}')
done
값을 가져온 후 if 조건을 사용하여 값을 기준으로 diff 변수에 저장합니다.