Paepoi » ShellScript Tips » ShellScript Tips | 繰り返し文
ShellScript Tips | 繰り返し文
# 最終更新日 2020.03.16
ISF 区切りの文字列、又は配列をシーケンスと扱ってループします。
continue や break も利用できます。
カレントディレクトリ内のファイルはワイルドカードで取得可能。
ファイル名に IFS が含まれていても問題なく展開される。
引数をすべてループする場合省略表記が使える。
for 文の結果をリダイレクトしたい場合は以下のように。
条件式は if 文と同様 test コマンドを使う。
for
シェルスクリプトの for 文は Python 等と同様に整数を使いません。ISF 区切りの文字列、又は配列をシーケンスと扱ってループします。
continue や break も利用できます。
#!/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 --- 2025.