dashにはbash等とは異なり配列がない。
制御コードを区切り文字にするとブランク含みの文字列も配列要素にできる。これだと構造を再帰的にできないけどどうせbash もできないし、制御文字を変えれば数次元配列くらいまでは再現できる。
(制御文字を使用しないパターン)
配列を作成する
$ array 1 "1 2" 3
11 23
$ y="`splt "1,1 2,3," ,`"
$ echo "$y"
11 23
制御コードが見えないのですべての要素が詰まって見える。
要素を取り出す
$ idx "`array 1 "1 2" 3`" 1
1 2
コマンド置換はコードがうるさい上にフォークが発生して遅いので戻り値用のグローバル変数に代入したほうがいいかもしれない。
部分配列
$range "`array 1 "1 2" 3`" 0 2
11 2
forループ
$ for_array i in `splt "1,1 2,3," ,`; do_array
> echo "$i"
> done_array
1
1 2
3
$
コード
_SI=$(printf '\017')
eval "FS=\"\${FS:-$_SI}\""
_ORG_F_OPT=+f
alias for_array='set -f; _OFS=$IFS; IFS='$FS'; for'
alias do_array='do IFS=$_OFS; set '"$_ORG_F_OPT"';'
alias done_array='_OFS=$IFS; done; IFS=$_OFS; set '"$_ORG_F_OPT"';'
if ! type return_val >/dev/null 2>&1; then
alias return_val='echo'
fi
array() {
set -f
set -- "$@"
local IFS="$FS"
return_val "$*$IFS"
set $_ORG_F_OPT
}
range() {
local IFS="$FS" i=$2 n=$3 t=
set -f
set -- $1
shift $i
while [ "$n" -ge 1 ]; do
t="$t$1$FS"
n=$((n-1))
shift
done
return_val "$t"
set $_ORG_F_OPT
}
idx() {
local IFS="$FS" i=$2 n=1
set -f
set -- $1
shift $i
return_val "$1"
set $_ORG_F_OPT
}
splt() {
local IFS="$2"
set -f
set -- $1$IFS
IFS="$FS"
return_val "$*$IFS"
set $_ORG_F_OPT
}