1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

dashで疑似配列

Last updated at Posted at 2019-04-24

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
}
1
0
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
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?