バー付きのコマンドラインで複数の変数に値を割り当てる方法


10

基本的に、シェルコマンドの出力の特定の部分を複数の変数に割り当てようとしていますが、その方法がわかりません。

簡単にするために、シェル上のコマンドが実行されると、

one two three four

これは、

echo "one two three four"

(実際のコマンドは異なります)

ここで、出力の2番目と4番目のワード(この場合は24)を変数w1w2に割り当てます。

次のようにreadコマンドを使用できると思いました:

echo "one two three four" | awk '{print $2 " " $4}' | read w1 w2

しかし、これは機能しません。おそらく、readコマンドがサブプロセスで実行されるためです。

それで、私は私が何を求めているかを達成するためにどうやって行きますか?


回答:


17

readは親の環境に影響を与えない子プロセスで実行されるため、これは機能しません。

いくつかのオプションがあります。

コマンドを次のように変換できます。

w1=$(echo "one two three four" | awk '{print $2}')
w2=$(echo "one two three four" | awk '{print $4}')

または、IFSを変更して次を使用しますset

OIFS="$IFS"
IFS=' '
set -- $(echo "one two three four" | awk '{print $2" "$4}')
IFS="$OIFS"
w1=$1 w2=$2

またはヒア文字列:

read w1 w2 w3 w4 <<< "one two three four"

4
ヒアストリングに基づく:a1 a2 a3 <<< $(echo one two three)
ペトルユーゼル

どうもありがとう。私は知りませんでした<<< Here String
ルネNyffenegger

1
安全のためには、使用する必要がありますread -rdo not allow backslashes to escape any characters
トム・ヘイル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.