11
10

More than 5 years have passed since last update.

Bashでコマンドライン実行結果を空白区切りで配列に入れる

Posted at

おことわり

人に聞かれて20分ぐらいで調べた範囲なので、ちょっと間違ってたりするかも。
あと説明に適したシチュエーションが見つからなかったので、応用例がほしい。

やりたいこと

出力結果が空白区切りになるコマンドを配列に入れてゴニョゴニョしたい。

例えば、foo bar bazという出力のfoobarbazをそれぞれ別変数として処理したい。

やり方

example.sh
#!/bin/bash

declare -a FOOBARBAZ=($(echo foo bar baz))

echo ${FOOBARBAZ[0]}
echo ${FOOBARBAZ[1]}
echo ${FOOBARBAZ[2]}
出力
$ bash example.sh
foo
bar
baz

shでは動かない模様。

解説

その1

echo foo bar baz

ここはただ単にコマンドを実行しているだけ。
お好みのコマンドに置き換えてください。

その2

declare -a FOOBARBAZ=($(echo foo bar baz))

ここが本題。

FOOBARBAZ=$(echo foo bar baz)としたときはただ単に文字列foo bar baz$FOOBARBAZに代入するだけ。

Bashで配列を扱うには、配列として宣言された変数と配列リテラルが必要になる。

変数を配列として宣言するにはdeclare -aをつけて変数を宣言する。右辺値を同時に書いて良い。

配列リテラルは(0 1 2 3)とカッコで始り空白で区切られた要素で構成される。

その3

echo ${FOOBARBAZ[0]}

配列の要素を参照するには、${VARNAME[N]}というように変数名と添字をブラケットでくくる必要がある。
もし$VARNAME[N]とすると、$VARNAME[N]だけ評価されてしまうので注意。
$VARNAME${VARNAME[0]}と同じ内容が出るようだ。

その他

  • declare -Aとすると、連想配列が作れるらしい。
  • 配列の要素の代入はどうするのだろう。
  • 配列の長さを取得する文法があるので、いつかまとめる。

参考

11
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
10