4

bash スクリプトでは、同じファイルを引数として連続して数回含める必要があります。このような:

convert image.png image.png image.png [...] many_images.png

image.png数回繰り返す必要があります。

パターンを繰り返すための bash の短縮形はありますか?

4

7 に答える 7

10

ブレース拡張を使用してこれを行うことができます:

convert image.png{,,} many_images.png

生成されます:

convert image.png image.png image.png many_images.png

中括弧の展開では、中括弧内の各コンマ区切り文字列の前(および後)に文字列が繰り返され、接頭辞、コンマ区切り文字列、および接尾辞で構成される文字列が生成されます。生成された文字列をスペースで区切ります。

この場合、中括弧と接尾辞の間のコンマ区切りの文字列は空の文字列であり、文字列image.pngを3回生成します。

于 2010-08-06T13:26:18.687 に答える
7

これは、指定された整数 (以下の例では 10) で機能します。

$ echo $(yes image.png | head -n10)
image.png image.png image.png image.png image.png image.png image.png image.png image.png image.png

また、以下でも使用できますxargs

$ yes image.png | head -n10 | xargs echo
image.png image.png image.png image.png image.png image.png image.png image.png image.png image.png
于 2010-08-06T13:39:49.383 に答える
2

これは、配列を使用するソリューションであり、スペースや改行などを含む文字列に対して堅牢です。

declare -a images
declare -i count=5
for ((i=0; i<count; ++i))
do
    images+=(image.png)
done
convert "${images[@]}" many_images.png
于 2010-08-06T13:29:33.733 に答える
2
#!/bin/bash

function repeat {
    for ((i=0;i<$2;++i)); do echo -n $1 " "; done
}

convert $(repeat image.png 3) many_images.png
于 2010-08-06T13:15:01.200 に答える
0

これはあなたのために働くかもしれません:

convert $(printf "image.png %.s" {1..5}) many_images.png

image.pngこれは前に5回繰り返されますmany_images.png

于 2011-12-10T10:24:08.117 に答える
0

$(command) を使用して bash の不要なインスタンスを開く遅いコードを回避するcommandには、中かっこ展開を使用できます。

ファイル名を 3 回繰り返すには、次のようにします。

file="image.png"; convert "${file[0]"{1..3}"}" many_images.png

または、変数を使用して繰り返されるファイル名の数を指定する、より物議を醸すバージョン:

n=10; file="image.png"; eval convert \"\${file[0]\"{1..$n}\"}\" many_images.png

使い方。

${file[0]} は $file または ${file} と同じです

Bash は最初にブレース展開を行うため、次のようなシーケンスになります。

${file[0]1} ${file[0]2} ${file[0]3}

Bash はこれらの余分な数字を親切に無視します。

${file[0]} ${file[0]} ${file[0]}

これは次のように単純化されます

${file} ${file} ${file}

その後

$file $file $file

それが私たちが望むものです。

于 2014-03-08T06:50:30.497 に答える