Fishの基礎 - 繰り返し文
概要
for文
for <変数名> in <変数 または 式>
<コマンド 1>
<コマンド 2>
# ...
end
for
文はループ構成であり、<コマンド>で指定されたコマンドを複数回実行する。
各反復で、<変数名>で指定されたローカル変数に新しい値が代入される。
<変数名>が空の場合、<コマンド>は実行されずにループが終了する。
(この時、<変数名>には、最後に割り当てられた値が格納されている)
<変数名>がまだ存在しない場合、ローカルスコープに設定される。
もし、for
ブロックが関数内に存在しない場合、同名のグローバル変数とユニバーサル変数があれば、それが使用される。
set
と同様に、for文は$status
を変更しないが、その下位のコマンドの評価によって変更される。
for i in foo bar baz
echo $i
end
# 出力
foo
bar
baz
※注意
Fish 3.0.0以前のバージョンでは、<変数名>はfor
ブロックのローカル変数である。
ループが終了した時の<変数名>に最後に代入された値は、ループの外では使用できない。
# Fish 3.0.0以前の場合
for VAR in a b c
echo -n ""
end
# もし、for文の実行前に変数VARが存在している場合は、その代入されていた値を出力する
echo $VAR
# 出力
# 何も出力されない
Fishのfor
文は、$IFS
ではなく改行で分割する。
もし、改行以外で分割する場合は、string split
、string split0
、string collect
を使用する。
以下の例では、for
文の変数に対して、改行以外で分割して代入している。
for i in (find . -iname "hoge" -print0 | string split0)
echo $i
end
while文
while <変数 または 式>
<コマンド 1>
<コマンド 2>
# ...
end
while
文は、<変数 または 式>を繰り返し実行して、終了ステータスが0
であれば<コマンド>を実行する。
while
文の終了ステータスは、実行された<コマンド>の最後の反復処理の終了ステータス、または、何も実行されていない場合は0
になる。
(これは他のシェルと同様、POSIX互換である)
複雑な条件として、and
やor
を使用することができる。
break
を含むwhile true
文を使用すると、さらに複雑な制御が可能である。
Fishでは、until
文が存在しないため、while not
文やwhile !
文を使用すること。
以下の例では、foo.txtファイル、または、bar.txtファイルが存在する限り、10秒間隔でfile existsと出力している。
while [ -f foo.txt ]; or [ -f bar.txt ]
echo "file exists"
sleep 10
end