Bus errorとSegmentation faultに困ったら見るブログ

物理の研究者による日々の研究生活のメモ書きです ( python/emacs/html/Japascript/シェルスクリプト/TeX/Mac/C言語/Linux/git/tmux/R/ポケモンGO)

【シェルスクリプト】配列(リスト)の使い方メモ

シェルスクリプトでも意外と配列が役に立つことがある
書き方がちょっと特殊なのでメモしておく

labellist=("A" "B" "C" "D")
のような感じで宣言する

この配列の中身を全部書きたいときは

echo ${labellist[@]}
ある要素だけを書きたいときは
echo ${labellist[$index]}
ちなみにこのindexは0, 1, 2, 3..と増えて行く(1始まりではない)


■ 参考 : UNIX & Linux コマンド・シェルスクリプト リファレンス > 配列を使用する


(追記)

ちなみに空のリストを作るときは

hoge=()
hoge=("")として、空の文字列の要素を作ってしまっていたので、最初ここで詰まった


複数に分かれたtxtファイルを一気にgnuplotでプロットさせる場合にこのリストを使うのがわりと便利そう
例えばこんなコード(こんなださいコードしか書けなくてすいません)

#!/bin/sh

plotdata=()
i=0

for data in `ls ./*.txt`
do
echo $data

FILE=$data
basename=${FILE##*/} # ディレクトリ名を消して、ファイル名だけにする
filename=${basename%.*} # ファイル名から拡張子を取り除いた部分

# ファイル名からGPS時刻を取得
# ここは関係ないので気にしない
if [ "$i" -eq 0 ]; then
GPS=$filename
echo $GPS
fi

# これでリストに収めていく 通し番号は0, 1, 2, ...
plotdata+=("$data")

echo $i
# リストが10個溜まったらプロットさせる
if [ "$i" -eq 9 ]; then
echo ${plotdata[@]}

gnuplot <<EOF
set term png
set output "${GPS}.png"

set xlabel "GPS[s] - ${GPS}"
set ylabel "something"
set title "hoge" noenhanced

plot "${plotdata[0]}" w l lw 2 notitle,\
"${plotdata[1]}" u (\$1+32):2 w l lw 2 notitle,\
"${plotdata[2]}" u (\$1+32*2):2 w l lw 2 notitle,\
"${plotdata[3]}" u (\$1+32*3):2 w l lw 2 notitle,\
"${plotdata[4]}" u (\$1+32*4):2 w l lw 2 notitle,\
"${plotdata[5]}" u (\$1+32*5):2 w l lw 2 notitle,\
"${plotdata[6]}" u (\$1+32*6):2 w l lw 2 notitle,\
"${plotdata[7]}" u (\$1+32*7):2 w l lw 2 notitle,\
"${plotdata[8]}" u (\$1+32*8):2 w l lw 2 notitle,\
"${plotdata[9]}" u (\$1+32*9):2 w l lw 2 notitle
EOF
i=-1
plotdata=()
# ここでリストを空にする
# これで次の10個が溜まったらまたこの分岐に入って、プロットできる
fi

# for文みたいに通し番号を増やしていく
i=`expr $i + 1`

done

本来書いたコードを修正しつつここに貼付けたので、このままでは動かないかも
参考程度にどうぞ





(追記)
絶対忘れるので追記、あと同じ記事にまとめておいた方が便利なので

echo ${#array[@]}
echo ${#array[*]}
で配列の要素数を取得
これらの違いはダブルクォートでくくったときに結果が異なるとかあったけど、今はたぶん関係ないので知らない


リストの一部を表示させたいときは・・・
眠いのでそのうち書けたら書く(たぶん書かないな)
参考にしたページは以下

■ 参考 : bash 配列まとめ