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
次のとおりです。1
Done!
if
これは、ステートメントが条件を一度だけ確認し、条件が満たされるとスクリプトが追加のfi
処理を続行するためです。echo 'Done!'
アイデアを実現するにはwhile
ループを使用する必要があります。while
条件が一致するまで繰り返します。
x=1
while [ $x -le 10 ]
do
echo $x
((x++))
done
echo 'Done!'
これで、while
変数の値が$x
10 より小さいたびにループが開始されます。条件が 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 printf
てman 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