繰り返しシーケンスを作成するには?

繰り返しシーケンスを作成するには?

ユーザーから変数を取得し、次のようなピラミッドを印刷するスクリプトを作成しようとしています。

*
**
***
****
*****

このスクリプトを使用しましたが、数値が表示されます。

for i in {1..5}

do

a=${a}${i}

echo ${a}

done

出力:

1
12
123
1234
12345

数字の代わりに「*」記号を挿入するには?

答え1

ループカウンタの代わりに変数に*文字を追加するだけです。a

for i in {1..5}
do
  a+='*'
  echo "${a}"
done

a="${a}*"代替もうまく機能しますが、このバージョンはよりきれいで明確であるとa+='*'思います。+=

whileループを使用してこれを行うには、次のようにします。

while (( "${#a}" < 5 )); do
  a+='*'
  echo "$a"
done

${#a}変数の文字列の長さに拡張されますa

上記のコードスニペット(および質問のコード)は、スライスの先頭aでvarが空または設定されていないと仮定します。そうでない場合は、最初に再初期化する必要があります。

a=

私はあなたがbashシェルを使用していると仮定します。 これは完全なマニュアルです。 ここにいるループ構造について。

答え2

デジタルトラウマこの場合、答えはより有効ですが、完全性のために文字を繰り返す伝統的なシェル方法を使用できますprintf

for i in {1..5}
do
  printf "%${i}s\n"
done | sed 's/ /*/g'

printfこれは必要なスペースの数を出力し、sedスペースを実際の希望の文字に置き換えるために使用されます。

指摘したとおりデジタルトラウマそしてジャニス、結果をprintf変数に保存し、シェルの部分文字列置換を使用してこれを防ぐことができますsed(ほとんどの場合、多数のサブシェルを生成するコストで):

for i in {1..5}
do
  a=$(printf "%${i}s")
  echo "${a// /*}"
done

echoシェルが*文字を解釈しないようにするには、ここに引用符が必要です。さらに、もはやecho\n

指摘したとおりゴジロは、tr次の文字よりも単一の文字を置き換えるのに適していますsed

for i in {1..5}
do
  printf "%${i}s\n"
done | tr ' ' '*'

(ただし、このsedバリアントを使用すると、必要な長さのテキストを繰り返すことができます。)

答え3

POSIX的に:

$ n=5 awk 'BEGIN{OFS="*";for(i=2;i<=ENVIRON["n"]+1;i++){$i="";print}}'

答え4

sedそして対応するコマンドを使用できますs/regexp/replacement/flags

seq 10 |sed 's/.*/printf "*%.0s" {1..&}/e'
*
**
***
****
*****
******
*******
********
*********
**********
  • これバナー e置換が行われた場合(パターン空間で)見つかったコマンドを実行し、パターン空間をその出力で置き換えることを示します。より牛に似た一種の栄養sed手動

  • コマンドprintf "STRING%.0s" {1..7}印刷ひも7回。これを見て回答

  • &内部に代替では、s/regexp/replacement/eパターン空間の完全一致部分を参照します。この場合、各番号は与えられた順序で順番に並べられますseq

関連情報