ユーザーから変数を取得し、次のようなピラミッドを印刷するスクリプトを作成しようとしています。
*
**
***
****
*****
このスクリプトを使用しましたが、数値が表示されます。
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
。