bash スクリプトでは、同じファイルを引数として連続して数回含める必要があります。このような:
convert image.png image.png image.png [...] many_images.png
image.png
数回繰り返す必要があります。
パターンを繰り返すための bash の短縮形はありますか?
bash スクリプトでは、同じファイルを引数として連続して数回含める必要があります。このような:
convert image.png image.png image.png [...] many_images.png
image.png
数回繰り返す必要があります。
パターンを繰り返すための bash の短縮形はありますか?
ブレース拡張を使用してこれを行うことができます:
convert image.png{,,} many_images.png
生成されます:
convert image.png image.png image.png many_images.png
中括弧の展開では、中括弧内の各コンマ区切り文字列の前(および後)に文字列が繰り返され、接頭辞、コンマ区切り文字列、および接尾辞で構成される文字列が生成されます。生成された文字列をスペースで区切ります。
この場合、中括弧と接尾辞の間のコンマ区切りの文字列は空の文字列であり、文字列image.pngを3回生成します。
これは、指定された整数 (以下の例では 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
これは、配列を使用するソリューションであり、スペースや改行などを含む文字列に対して堅牢です。
declare -a images
declare -i count=5
for ((i=0; i<count; ++i))
do
images+=(image.png)
done
convert "${images[@]}" many_images.png
#!/bin/bash
function repeat {
for ((i=0;i<$2;++i)); do echo -n $1 " "; done
}
convert $(repeat image.png 3) many_images.png
これはあなたのために働くかもしれません:
convert $(printf "image.png %.s" {1..5}) many_images.png
image.png
これは前に5回繰り返されますmany_images.png
$(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
それが私たちが望むものです。