シェルスクリプトはsed / awkを使用して値のペアを抽出しますか?

シェルスクリプトはsed / awkを使用して値のペアを抽出しますか?

次の文字列が与えられた場合:

NAME="bla" TYPE="test" SIZE="10"

各ペアの値を別々のシェルスクリプト変数に入れたいと思います。たとえば、3つの変数があり、最初の変数にbla値をロードし、2番目の変数でテストし、3番目の変数に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変数に保存します。

関連情報