18
18

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.

bashでIFSを使わずにsplitする方法

Last updated at Posted at 2017-07-17

はじめに

こんな方法があるなんて知らなかった。
IFSなんていらなかったんだ!

ここに載っていたのを模倣しただけです。
でも日本語の記事が見当たらなかったので書きました。

環境

  • OS: macOS Sierra 10.12.4
  • bash: GNU bash, version 3.2.57

やりたいこと

文字列を指定したデリミタで分割して配列に格納したい。
いわゆるsplitです。

まずは結論から

例えばパスからディレクトリの配列を得るにはこうなる。
split(というか置換してるだけ)の処理は一行。便利!

split-sub.sh
#!/bin/bash

path=$1;
declare -a a_dirs=();
a_dirs=${path//\// };

for dir in ${a_dirs[@]};
do
  echo $dir;
done

exit 0;

実行結果

$ ./split-sub.sh $(pwd)
Users
tommarute
script
split_test

今までの方法

よくあるIFSを使ったやり方。

split-ifs.sh
#!/bin/bash

function split() {
    local -a _dirs=();
    path=$1;
    c_ifs=$IFS;
    IFS=$2;
    _dirs=$(echo $path);
    IFS=$c_ifs;
    echo $_dirs;
}

main() {
    declare -a a_dirs=();
    a_dirs=($(split $1 '/'));

    for dir in ${a_dirs[@]};
    do
      echo $dir;
    done
    exit 0;
}

main $@;

実行結果

$ ./split-ifs.sh $(pwd)
Users
tommarute
script
split_test

おまけ

今回書いた方法は、デリミタを空白に置換して配列に変換しているわけで、であればtrでもできるんじゃ。。

と思ってやってみたらできました。
気づかなかった。

#!/bin/bash

path=$1;
declare -a a_dirs=();
a_dirs=$(echo $path | tr '/' ' ');

for dir in ${a_dirs[@]};
do
  echo $dir;
done

exit 0;

実行結果

$ ./split-tr.sh $(pwd)
Users
tommarute
script
split_test

おわりに

bashでIFSを使わずにsplitする方法について書きました。
今までIFS使って書いたコード全てリファクタリングしたい。

!!!ご注意!!!
この記事はあくまで私がIFSを使ったsplitより簡単だと感じた手法について書いたものであり、決してIFSを否定するものではありません。

18
18
2

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
18
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?