「シェルスクリプトの基礎 - 配列」の版間の差分

197行目: 197行目:
  hoge, , piyo, , fuga,  
  hoge, , piyo, , fuga,  
  hoge, piyo, fuga, foo, bar, bazz
  hoge, piyo, fuga, foo, bar, bazz
</syntaxhighlight>
<br><br>
== 配列の要素をソートする ==
==== 文字列としてソートする ====
配列の全要素を出力した上で、<code>sort</code>コマンドでソートを実行して、実行結果を配列に格納する。<br>
<br>
まず、配列の要素に空白が含まれる場合を考慮して、IFSを改行のみに変更する。<br>
これは、ソートした配列を生成する時、空白区切りで要素が設定されることを防ぐ。<br>
次に、各要素を<code>echo</code>コマンドで出力することで、全要素が改行区切りで出力されるため、<code>sort</code>コマンドによるソートが可能になる。<br>
<syntaxhighlight lang="sh">
#!/bin/sh
IFS_BACKUP="$IFS"
IFS="\n";
array=("222 222" "ccc ccc" "aaa aaa" "111 111" "bbb bbb" "333 333")
array=$(for item in "${array[@]}"; do echo "$item"; done | sort)
for element in "${array[@]}"
do
    echo ${element}
done
IFS="$IFS_BACKUP"
# 出力
111 111
222 222
333 333
aaa aaa
bbb bbb
ccc ccc
</syntaxhighlight>
<br>
==== 数値としてソートする ====
要素を数値としてソートするには、<code>sort</code>コマンドに<code>-n</code>オプションを指定する。<br>
<syntaxhighlight lang="sh">
#!/bin/sh
IFS_BACKUP="$IFS"
IFS="\n";
array=(2 3 04 000 001)
array=$(for item in "${array[@]}"; do echo "$item"; done | sort -n)
for element in "${array[@]}"
do
    echo ${element}
done
IFS="$IFS_BACKUP"
# 出力
000
001
2
3
04
  </syntaxhighlight>
  </syntaxhighlight>
<br><br>
<br><br>