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

文字列「__FORCETOC__」を「{{#seo: |title={{PAGENAME}} : Exploring Electronics and SUSE Linux | MochiuWiki |keywords=MochiuWiki,Mochiu,Wiki,Mochiu Wiki,Electric Circuit,Electric,pcb,Mathematics,AVR,TI,STMicro,AVR,ATmega,MSP430,STM,Arduino,Xilinx,FPGA,Verilog,HDL,PinePhone,Pine Phone,Raspberry,Raspberry Pi,C,C++,C#,Qt,Qml,MFC,Shell,Bash,Zsh,Fish,SUSE,SLE,Suse Enterprise,Suse Linux,openSUSE,open SUSE,Leap,Linux,uCLnux,Podman,電気回路,電子回路,基板,プリント基板 |description={{PAGENAME}} - 電子回路とSUSE Linuxに関する情報 | This pag…
 
(同じ利用者による、間の5版が非表示)
67行目: 67行目:
  array[${#array[@]}]=h
  array[${#array[@]}]=h
   
   
  for i in ${!array[@]}
  for i in "${!array[@]}"
  do
  do
     echo $i ${array[$i]}
     echo "$i" "${array[$i]}"
  done
  done
   
   
  # 出力
  # 出力
  a
  0 a
  b
  1 b
  c
  2 c
  d
  3 d
  e
  4 e
  f
  5 f
  g
  6 g
  h
  7 h
  </syntaxhighlight>
  </syntaxhighlight>
<br><br>
<br><br>
109行目: 109行目:
   
   
  echo "${#array[@]}"
  echo "${#array[@]}"
# または
echo "${#array[*]}"
   
   
  # 出力
  # 出力
4
  4
  4
  </syntaxhighlight>
  </syntaxhighlight>
150行目: 153行目:
  element = c
  element = c
  element = d
  element = d
</syntaxhighlight>
<br>
配列の要素がスペースを含んでいる場合は、以下のように、配列をダブルクォーテーションで括る。<br>
<syntaxhighlight lang="sh">
#!/bin/sh
array=(1 2 3 4 5 "6 6")
for i in "${array[@]}"
do
    echo "${i}"
done
# 出力
1
2
3
4
5
6 6
</syntaxhighlight>
<br><br>
== 配列の再生成 ==
元の配列に対して、追加する値を配列化して再生成する方法がある。<br>
<br>
以下の例では、配列への要素の追加ではなく配列の再作成を行っているため、不連続だったインデックスも再作成され、通常通り0からの連番となる。<br>
<syntaxhighlight lang="sh">
# インデックスが不連続な配列を作成する
array[0]="hoge"
array[2]="piyo"
array[4]="fuga"
echo "${array[0]}, ${array[1]}, ${array[2]}, ${array[3]}, ${array[4]}, ${array[5]}"
# 全要素と追加する値を配列化して再生成する
# 不連続だったインデックスが連続したものに変化する
array=("${array[@]}" "foo" "bar" "bazz")
echo "${array[0]}, ${array[1]}, ${array[2]}, ${array[3]}, ${array[4]}, ${array[5]}"
# 出力
hoge, , piyo, , fuga,
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>
323行目: 431行目:
  </syntaxhighlight>
  </syntaxhighlight>
<br><br>
<br><br>
{{#seo:
|title={{PAGENAME}} : Exploring Electronics and SUSE Linux | MochiuWiki
|keywords=MochiuWiki,Mochiu,Wiki,Mochiu Wiki,Electric Circuit,Electric,pcb,Mathematics,AVR,TI,STMicro,AVR,ATmega,MSP430,STM,Arduino,Xilinx,FPGA,Verilog,HDL,PinePhone,Pine Phone,Raspberry,Raspberry Pi,C,C++,C#,Qt,Qml,MFC,Shell,Bash,Zsh,Fish,SUSE,SLE,Suse Enterprise,Suse Linux,openSUSE,open SUSE,Leap,Linux,uCLnux,Podman,電気回路,電子回路,基板,プリント基板
|description={{PAGENAME}} - 電子回路とSUSE Linuxに関する情報 | This page is {{PAGENAME}} in our wiki about electronic circuits and SUSE Linux
|image=/resources/assets/MochiuLogo_Single_Blue.png
}}


__FORCETOC__
__FORCETOC__
[[カテゴリ:シェルスクリプト]]
[[カテゴリ:シェルスクリプト]]