Frage

In einem Bash-Skript, muss ich die gleiche Datei mehrmals in einer Zeile als Argument enthalten. Wie folgt aus:

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

wo image.png sollte einige Male wiederholt werden.

Gibt es eine bash Stenografie ein Muster für die Wiederholung?

War es hilfreich?

Lösung

Das funktioniert mit einer bestimmten ganzen Zahl (10 im Beispiel unten).

$ 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

Es kann auch mit xargs verwendet werden:

$ 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

Andere Tipps

Sie können diese mit Klammer Expansion tun:

convert image.png{,,} many_images.png

erzeugt:

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

Brace Expansion wird die Zeichenfolge (e) vor (und nach) der Klammern für jede durch Kommata getrennte Zeichenkette innerhalb der geschweiften Klammern eine Zeichenfolge wiederholen consiting des Präfix, wobei das durch Kommata getrennte String und dem Suffix; und Trennen des erzeugten Strings von einem Leerzeichen eingeben.

In diesem Fall wird die durch Komma getrennte Zeichenfolge zwischen den Klammern und dem Suffix sind leere Strings, die die Zeichenfolge image.png dreimal produzieren werden.

#!/bin/bash

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

convert $(repeat image.png 3) many_images.png

Hier ist eine Lösung, dass Anwendungen Arrays und ist somit robust für Zeichenfolgen mit Leerzeichen, Zeilenumbrüche usw.

declare -a images
declare -i count=5
for ((i=0; i<count; ++i))
do
    images+=(image.png)
done
convert "${images[@]}" many_images.png

Dies könnte Arbeit für Sie:

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

Dies wird wiederholen image.png 5 mal vor many_images.png

langsamen Code Um zu vermeiden, dass unnötige Instanzen von bash öffnet mit $ (Befehl) oder command Sie Klammernerweiterung verwenden können.

einen Dateinamen 3-mal wiederholen tun:

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

oder eine umstrittene Version, die eine Variable verwendet Anzahl der wiederholten Dateinamen angeben:

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

Wie es funktioniert.

$ {file [0]} ist die gleiche wie $ Datei oder $ {file}

Bash tut Klammer Expansion erste und so macht es eine Sequenz wie folgt auf:

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

Bash kindly diese zusätzlichen Zahlen ignorieren, so dass Sie bekommen

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

Welche Vereinfacht zu

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

und dann

$file $file $file

Was ist das, was wir wollen.

POSIX 7 Lösung, die ich bisher gefunden habe:

N=3
S="image.png "
printf "%${N}s" | sed "s/ /$S/g"

da yes, seq und {1..3} ist nicht POSIX.

Für Ihr konkretes Beispiel:

N=
convert $(printf "%${N}s" | sed "s/ /image.png /g") many_images.png
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top