Paepoi

Paepoi » ShellScript Tips » ShellScript Tips | 配列

ShellScript Tips | 配列

# 最終更新日 2022.05.01

- 一部追記と連想配列を追加

配列 (bash)
#!/bin/bash

# 配列というと C 言語のものを想像しますがまったく違いかなり使い辛い
# bash では $IFS 区切りの文字列で充分ですが知識だけでも

# 配列の作成、括弧で囲む
array=(先頭 次の項目 最後)

# echo してみる、インデックス指定無しだと先頭が出力される
echo $array
#=> 先頭

# インデックスは C 言語と同様、ただしブレースが必要
echo ${array[1]}
#=> 次の項目

# += で追加できる、括弧で囲む必要あり
array+=(追加)

# インデックスを使って追加や書き換えできる
array[2]=三番目

# 範囲は関係ない、インデックスは並び順ではなく番号
array[10]=九番目
echo ${array[10]}
#=> 九番目

# 単なる未定義になる
echo 百番目は ${array[100]} です
#=> 百番目は です

# ポインタではない
array[4]=${array[0]}
array[0]=最初
echo ${array[4]}
#=> 先頭

# 全てを出力する時は @ を指定
# for item in "${array[@]}"; do
# にてループ文に使える
echo ${array[@]}
#=> 最初 次の項目 三番目 追加 先頭 九番目

配列 (zsh)
#!/bin/zsh

# zsh の場合はループを使うために必須の知識になります
# インデックスがゼロではなく 1 から始まることに注意

# 配列の作成、括弧で囲む
array=(先頭 次の項目 最後)

# echo してみる、インデックス指定無しだと全部出力される
echo $array
#=> 先頭 次の項目 最後

# インデックスは C 言語と同様
# bash と違ってブレース不要
# 先頭は 1 で最後は -1
#echo ${array[1]}
echo $array[2]
#=> 次の項目

# += で追加できる
# bash と違い括弧で囲む必要はない
#array+=(追加)
array+=追加
# @ は bash 互換として使えるようです、不要だけど
echo $array[@]
#=> 先頭 次の項目 最後 追加

# インデックスを使って追加や書き換えできる
# bash と同じだけどインデックス番号に注意
array[3]=三番目
echo $array[@]
#=> 先頭 次の項目 三番目 追加

# 範囲は関係ない、インデックスは並び順ではなく番号
array[10]=九番目
echo $array[10]
#=> 九番目

# 単なる未定義になる
echo 百番目は $array[100] です
#=> 百番目は です

# ポインタではない
array[-2]=$array[1]
array[1]=最初
echo $array[-2]
#=> 先頭

# for は bash の ISF 区切り同様
for item in $array; do
    echo "item: $item"
done
# bash と同じヒアドキュメントで無理やり複数業コメントが可能
# atom, vscode 等は色分けしてくれる
: << __OUTPUT__
item: 最初
item: 次の項目
item: 三番目
item: 追加
item: 先頭
item: 九番目
__OUTPUT__r

連想配列
#!/bin/sh

# 連想配列は bash zsh ともに一応使えますが、、、、、

# declare で A 属性にする (Associative array)
# typeset は bash にて廃止予定らしい
declare -A suzuki=([バイク]=かっこいい [車]=ステキ)

# 取り出しは配列同様にブレースが必要
echo ${suzuki[車]}

# 追加
suzuki[シニアカー]=サイコー

# キーを全部取り出しは bash zsh で違っている
if [[ $SHELL =~ zsh ]]; then
    echo ${(k)suzuki[@]}
else
    echo ${!suzuki[@]}
fi

# 値を全部取り出し
echo ${suzuki[@]}
Copyright(C) sasakima-nao All rights reserved 2002 --- 2024.