私をパニックにさせる質問があります。というファイルがありますfilex.txt
$ cat filex.txt
I love my India.
ユーザーからの入力を受けて何度も印刷したい。以下に、テキストを30回自動的に繰り返して別のテキストファイルに入れる例を示します。
echo "Number of times you want to repeat:"
read repeat # for example user entered 30
cat link_no_follow.txt | perl -ne 'for$i(0..$repeat){print}' >filex2.txt
$repeat
ユーザー入力を保存するために変数を使用します。しかし、これはうまくいきません。誰かが私に解決策を与えることができますか?
答え1
perl
実際にforループを使用する必要はなく、bashディレクトリを使用できます。次の例を考えてみましょう。
#!/bin/bash
content="$(cat filex.txt)"
echo -n "Number of times you want to repeat: "
read repeat
for ((i = 0; i < repeat; ++i)); do
echo "${content}"
done
スクリプトは最初にその内容をfilex.txt
名前付き変数として読み込みますcontent
。その後、繰り返し回数を求めるプロンプトが表示され、それをユーザーから変数として読み込みますrepeat
。
次に、for
ループを使用してcontent
repeat
数を印刷します。ループの構造はfor
次のとおりです。
for ((init; condition; update))
このinit
部分はループの開始時に一度実行され、その部分がcondition
評価されます。 true の場合、ループが実行されます。ループが完了したら、そのupdate
部分を実行します。以下は状況を再評価することです。条件が偽になるまで続きます。 ++i
うん、短縮i = i + 1
。
私が取得するスクリプトを実行すると、次のようになります。
$ ./ex.sh
Number of times you want to repeat: 3
I love my India.
I love my India.
I love my India.
答え2
一重引用符で囲まれたPerl式の中には、シェル変数はrepeat
表示されません。
Perlを使って本当にこれをしたい場合は、次のことができます。
$ repeat=3
$
$ perl -ne 'BEGIN{$repeat = shift} print $_ x $repeat' "$repeat" filex.txt
I love my India.
I love my India.
I love my India.
Perl引数ベクトル(暗黙的にvia shift
)を使用してシェル変数の値を渡し、repeat
それをPerl変数に割り当てます$repeat
。filex.txt
複数の行が含まれている場合は、各行$repeat
に対して順番に1回繰り返されます。
答え3
repeat
変数のプロンプトと読み方が既にわかっているので、その値が5であるとします。
$ seq "$repeat" | xargs -I{} cat filex.txt
I love my India.
I love my India.
I love my India.
I love my India.
I love my India.