bashでは、forループのループ制御で整数変数を使用できますか?


65

次のbashスクリプトがあります。

#!/bin/bash

upperlim=10

for i in {0..10}
do
echo $i
done

for i in {0..$upperlim}
do
echo $i
done

最初のfor(ループなしの可変upperlimループ制御中)は正常に動作するが、第二for(ループ可変upperlimループ制御では)ありません。2番目のforループを修正して動作させる方法はありますか?御時間ありがとうございます。


4
hm、for i in {0..$((upperlim))}; do echo $i; done動作しません
ボンシスコット

+1行動が面白いと思うため
Bonsi Scott


これに答える外部リンク:cyberciti.biz/faq/…–
kon

回答:


62

その理由は、bashで発生する順序です。中括弧の展開は変数が展開される前に発生します。目標を達成するには、Cスタイルのforループを使用する必要があります。

upperlim=10

for ((i=0; i<=upperlim; i++)); do
   echo "$i"
done

1
そしてzsh、同様に動作します(ではなくcshtcsh)。
数学

29

組み込みのみを使用してスタイルでこれを完了するには、evalを使用する必要があります。

d=12

for i in `eval echo {0..$d}`
do
echo $i
done

しかしseq

lowerlimit=0
upperlimit=12

for i in $(seq $lowerlimit $upperlimit)
do
echo $i
done

個人的には、の使用seqがより読みやすいと感じています。


「組み込み」の場合 seqは外部コマンドであり、bashのどこでも利用できるわけではありません。
ヨルダン

9
@jordanm:すべてのビルトインをbashで使用します。それから私は「しかしseq」と言って、それが組み込みではないことを認めました。
ジョディC

ブレース拡張が組み込まれているという事実は、ここでは問題ではありません。readたとえばビルトインですが、理由はありませんeval
ヨルダン

1
組み込みはまったく問題ありません。私は、質問者にオールバッシュのソリューションを提供したかったのです。これについて議論し続けたい場合は、チャットに参加してください。コメントはこの種のものには良くありません
ジョディC

8

POSIXの方法

移植性に関心がある場合は、POSIX標準の例を使用してください。

i=2
END=5
while [ $i -le $END ]; do
    echo $i
    i=$(($i+1))
done

出力:

2
3
4
5

POSIX ではないもの:


1

bashでは、パラメーター展開の前にブレース展開が行われるため、アプローチは機能しません。前に変数を展開する必要があります。

evalで回避できます:

upperlim=10
eval '
        for i in {0..'"$upperlim"'}
        do
                echo $i
        done
'

Whileループ

upperlim=10
#with while
start=0
while [[ $start -le $upperlim ]]
do
    echo "$start"
    ((start = start + 1))
done

また、あなたはseqコマンドでそれを行うことができます:

upperlim=10
#seq
for i in $(seq "$upperlim"); do
  echo "$i"
done

一緒に実行したい場合for i in {0..$upperlim}は、kornshellを使用する必要があります。例えば:

#!/bin/ksh
upperlim=10

for i in {0..$upperlim}
do
        echo $i
done
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.