Wie ein paar Zeichen ein paar Mal in bash wiederholen?
-
26-09-2019 - |
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?
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