「if」1つと「then」2つ:なぜダメですか? [閉鎖]

「if」1つと「then」2つ:なぜダメですか? [閉鎖]

10に達するまで数字を数えて出力し、停止するたびにスペースを追加するスクリプトを作成したいと思います。私はスクリプトを学んでおり、学習するための簡単なスクリプトを作成します。これまで私がしたことは次のとおりです。

x= 1
if ["$x" < "10"] then
echo [ $x += 1 ]
echo "\n"
then
echo "done!"  
fi

答え1

単純なif,then節は次から成ります。

if followed by one or more conditions
then
   some actions
fi
some further actions

ご覧thenのとおり、追加の処理を実行するために他のものを追加する必要はありません。したがって、あなたの状況は次のようになります。

x=1
if [ $x -le 10 ]
then
   echo "$x"
   ((x++))
fi
echo 'Done!'

これでwork句がありますが、if返された唯一の項目はthen次のとおりです。1Done!

ifこれは、ステートメントが条件を一度だけ確認し、条件が満たされるとスクリプトが追加のfi処理を続行するためです。echo 'Done!'

アイデアを実現するにはwhileループを使用する必要があります。while条件が一致するまで繰り返します。

x=1
while [ $x -le 10 ]
do
    echo $x
    ((x++))
done
echo 'Done!'

これで、while変数の値が$x10 より小さいたびにループが開始されます。条件が false を返す場合 ($x の値が 10 以下)、ステートメントにジャンプしてdone追加処理を続行します。この場合echo 'Done!'

答え2

コンピュータはどのブランチを使用するかを決定できないからです!各ifブランチは、ブール式[TRUE / FALSE]を使用して特定のコードを実行または実行しません。したがって、各決定にはジョブブランチの実行が必要です。そのため、1つだけを使用してくださいthen

let 'x = 1'
if [ "$x" -lt 10 ] # if you want to write the `then` on the same line you need a ; in front of it
then
    let 'x++'
    echo "$x"
    # echo automatically creates a newline
    # the second then is useless or even wrong
    echo "done!"  
fi

help [シェルでもこれを見ることができます。

[: [ arg... ]
    Evaluate conditional expression.

    This is a synonym for the "test" builtin, but the last argument must
    be a literal `]', to match the opening `['.

man -s1 test有効なテスト式を見るには読んでください。

ヒント

あなたの表現[ "$x += 1" ] は実際に1から10まで繰り返すことを意味するようです。シェルは算術サポートに制限があるため、次のことをお勧めしますseq

for x in `seq 1 9`
do echo $x
done
echo "done!"

for非常に長いシーケンスの場合は、ループの入力文字列を生成せずに値を1つずつ読み取ることをお勧めします。

seq 1 1000|while read x
do echo $x
done

そして確認しman 1 printfman 3 printf(通常はprintf(1)とprintf(3)で書かれていますが、初心者と言われました)空白を追加してください

printf "%*s%s" $x "" "line"

"line"の前に$xスペースを追加してください。

勝利

for x in `seq 0 9`
do let 'y=2*(9-x)'
    printf "%*s%s%*s%s\n" $x "" "data" $y "" "data"
done

関連情報