Paepoi

Paepoi » ShellScript Tips » ShellScript Tips | 繰り返し文

ShellScript Tips | 繰り返し文

# 最終更新日 2020.03.16

for
シェルスクリプトの for 文は Python 等と同様に整数を使いません。
ISF 区切りの文字列、又は配列をシーケンスと扱ってループします。
continuebreak も利用できます。
#!/bin/sh

# zsh でも直接 for なら展開できます
for bike in YAMAHA HONDA SUZUKI KAWASAKI ; do
    [[ $bike = HONDA ]] && continue
    [[ $bike = KAWASAKI ]] && break
    echo $bike
done

# C 言語風に整数を使うことも一応できます
for (( i=1; i<5; i++ )); do
    echo $i
done

# でもブレース展開のほうが理解しやすいと思う
for n in {1..5}; do
    echo $n
done

# ブレース展開のできないショボいシェルは seq を使う
#for nn in `seq 1 5`; do

カレントディレクトリ内のファイルはワイルドカードで取得可能。
ファイル名に IFS が含まれていても問題なく展開される。
#!/bin/sh

for filename in *; do
    echo $filename
done

# 特定の拡張子のみを選択して使う場合が多い
for pyfile in *.py; do
    echo $pyfile
done

引数をすべてループする場合省略表記が使える。
#!/bin/sh

#for arg in "$@"; do
for arg; do
    echo $arg
done

for 文の結果をリダイレクトしたい場合は以下のように。
#!/bin/sh

# /usr/bin の中身を $HOME に出力するサンプル
# done の後ろに > で for 文の結果をリダイレクト

for name in `ls /usr/bin`; do
    echo $name
done > ~/output.txt

区切り文字の変更(bash)
#!/bin/bash

# $IFS は区切り文字を定義する変数
# デフォルトは スペース、タブ、改行(0xff,0x09,0x0a)

_IFS=$IFS
IFS=,
csv=カンマ,区切りの,テキスト

for s in $csv; do
    echo $s
done

# 元に戻す
IFS=$_IFS

区切り文字の定義(zsh)
#!/bin/zsh

motor='スズキかっこいいカワサキかっこいいヤマハ'

for j in ${(ps.かっこいい.)motor}; do
    echo $j
done

while, until
while は条件が真、until は条件は偽の場合に繰り返す制御文。
条件式は if 文と同様 test コマンドを使う。
#!/bin/sh

buf1=あ
while [[ $buf1 != あああああ ]]; do
    echo $buf1
    buf1+=あ
done

buf2=い
until [[ $buf2 == いいいいい ]]; do
    echo $buf2
    buf2+=い
done

無限ループ
#!/bin/sh

# while true は while : でいい

echo y で終了
while : ; do
    # bash
    read -p '> ' res
    # zsh
    #read res\?'> '
    [[ $res = y ]] && break
done

Copyright(C) sasakima-nao All rights reserved 2002 --- 2020.