web-dev-qa-db-ja.com

Linux bash:複数の変数の割り当て

Linux bashには、PHPの次のコードに似たものが存在します。

list($var1, $var2, $var3) = function_that_returns_a_three_element_array() ;

つまり、1つの文で対応する値を3つの異なる変数に割り当てます。

文字列「qwert asdfg zxcvb」をstdoutに書き込むbash関数myBashFuntionがあるとします。次のようなことをすることは可能ですか?

(var1 var2 var3) = ( `myBashFuntion param1 param2` )

等号の左側の部分は、もちろん有効な構文ではありません。私はちょうど私が求めているものを説明しようとしています。

ただし、機能するのは次のとおりです。

array = ( `myBashFuntion param1 param2` )
echo ${array[0]} ${array[1]} ${array[2]}

ただし、インデックス付き配列は、単純な変数名ほど記述的ではありません。
ただし、次のことができます。

var1 = ${array[0]} ; var2 = ${array[1]} ; var3 = ${array[2]}

しかし、これらは私が避けたいと思う3つのステートメントです。

ショートカット構文を探しています。出来ますか?

101
GetFree

私の頭に浮かぶ最初のもの:

read -r a b c <<<$(echo 1 2 3) ; echo "$a|$b|$c"

出力は、当然のことです

1|2|3

値を配列に割り当てたいと思いました。 Michael Krelinのアプローチ を拡張して、私はしました:

read a[{1..3}] <<< $(echo 2 4 6); echo "${a[1]}|${a[2]}|${a[3]}"

生成されるもの:

2|4|6 

予想通り。

15
soundray

これが役立つと思います...

スクリプトでユーザーが入力した日付(mm/dd/yyyy)を分類するために、日、月、年を配列に格納し、次のように値を個別の変数に入れます。

DATE_ARRAY=(`echo $2 | sed -e 's/\// /g'`)
MONTH=(`echo ${DATE_ARRAY[0]}`)
DAY=(`echo ${DATE_ARRAY[1]}`)
YEAR=(`echo ${DATE_ARRAY[2]}`)
4
SDGuero

ファンキーなことをしなければならないこともあります。コマンド(たとえばSDGueroによる日付の例)から読み取りたいが、複数の分岐を避けたいとします。

read month day year << DATE_COMMAND
 $(date "+%m %d %Y")
DATE_COMMAND
echo $month $day $year

Readコマンドにパイプすることもできますが、サブシェル内で変数を使用する必要があります。

day=n/a; month=n/a; year=n/a
date "+%d %m %Y" | { read day month year ; echo $day $month $year; }
echo $day $month $year

結果は...

13 08 2013
n/a n/a n/a
3
Otheus

O'Reillyによる Bash Cookbook の第5章では、(=)記号の周りにスペースがないという変数割り当ての要件の理由について説明しています。

MYVAR="something"

説明は、コマンド名と変数(「=」は有効な引数の場合があります)を区別することに関係しています。

これはすべて、イベントの後の正当化に少し似ていますが、いずれにしても、変数のリストに割り当てる方法については言及されていません。

0
pavium