制御構文 ~ for ループ

単語のリストを for ~ in でループ

code
# ブランク文字で区切られた単語をループ
for item in apple	orange banana; do
  echo "${item}"
done
stdout
apple
orange
banana
code
# 単語にブランク文字が含まれる場合はクォートで囲む
for name in 'sampe 1' 'sample	2' "sample 3" "sample	4"; do
  echo "${name}"
done
stdout
sampe 1
sample	2
sample 3
sample	4

配列を for ~ in でループ

code
declare -a arr=(apple orange banana)

for name in "${arr[@]}"; do
  echo "${name}"
done
stdout
apple
orange
banana
code
declare -a arr=(apple orange banana)

# ${arr[*]} の場合は配列全体が1つの単語として展開されるので注意
for name in "${arr[*]}"; do
  echo "${name}"
done
stdout
apple orange banana

連想配列を for ~ in でループ

code
declare -A hash=(
  [apple]=100
  [orange]=80
)

# 連想配列の値をループ
for val in "${hash[@]}"; do
  echo "${val}"
done
stdout
80
100
code
declare -A hash=(
  [apple]=100
  [orange]=80
)

# 連想配列のキーをループ
for key in "${!hash[@]}"; do
  echo "${key}" = "${hash[${key}]}"
done
stdout
orange = 80
apple = 100

ファイルやフォルダの一覧を for ~ in でループ

code
mkdir files
touch files/1.txt files/2.txt
mkdir files/dir

ls files/
echo '------------------------------'
for name in files/*; do
  echo "${name}"
done
stdout
1.txt
2.txt
dir
------------------------------
files/1.txt
files/2.txt
files/dir
code
mkdir 'files 0'
touch 'files 0/1 1.txt' 'files 0/1 2.txt'

ls 'files 0/'
echo '------------------------------'
# ファイル名にブランク文字が含まれていても問題ない
for name in 'files 0'/*; do
  echo "${name}"
done
stdout
1 1.txt
1 2.txt
------------------------------
files 0/1 1.txt
files 0/1 2.txt

コマンド置換の出力を for ~ in でループ

code
for c in $(printf 'Hello World!' | od -A n -tx1); do
  echo -e "${c} : \x${c}"
done
stdout
48 : H
65 : e
6c : l
6c : l
6f : o
20 :  
57 : W
6f : o
72 : r
6c : l
64 : d
21 : !

算術式を使用した for ループ

code
# i が 0 ~ 2 まで 計 3 回ループ
for ((i=0; i<3; i++)); do
  echo "i=${i}"
done
stdout
i=0
i=1
i=2
code
# 1 ~ 10 までの奇数をループ
for ((i=1; i<=10; i+=2)); do
  echo "i=${i}"
done
stdout
i=1
i=3
i=5
i=7
i=9
code
# 複数の変数を使用したループ
for ((i=0, j=5; i<j; i++, j--)); do
  echo "i=${i}, j=${j}, i+j=$((i+j))"
done
stdout
i=0, j=5, i+j=5
i=1, j=4, i+j=5
i=2, j=3, i+j=5

ブレース展開を使用したループ

code
for i in {1,2,3}; do
  echo "i=${i}"
done
stdout
i=1
i=2
i=3
code
for i in {1..5}; do
  echo "i=${i}"
done
stdout
i=1
i=2
i=3
i=4
i=5
code
for i in {1..2}-{A..C}; do
  echo "i=${i}"
done
stdout
i=1-A
i=1-B
i=1-C
i=2-A
i=2-B
i=2-C