|
michahe
Anmeldungsdatum: 12. Dezember 2013
Beiträge: 874
|
Hallo, folgendes funktioniert:
| dryrun="--dry-run"
option=(--verbose --info=progress2 --recursive --rsh='ssh') # Optionsliste unvollständig, nur als Beispiel!
rsync "${option[@]}" $__source $__target
|
Nun habe ich jedoch in einem bash-Script die gewählten Optionen in einem String 'optionsSEL' gesammelt:
| echo $optionsSEL
--verbose --info=progress2 --recursive --rsh='ssh'
|
Ich scheitere daran, den String optionsSEL und die Variable dryrun so zu transformieren, dass beides zusammen als Array gesehen wird und freue mich über eine Hilfestellung. Danke, Michael
|
|
Marc_BlackJack_Rintsch
Ehemalige
Anmeldungsdatum: 16. Juni 2006
Beiträge: 4735
|
Wo genau ist das Problem?
| bj@god:~$ dryrun='--dry-run'
bj@god:~$ optionsSEL="--verbose --info=progress2 --recursive --rsh='ssh'"
bj@god:~$ options=($optionsSEL "$dryrun")
bj@god:~$ echo "${options[@]}"
--verbose --info=progress2 --recursive --rsh='ssh' --dry-run
bj@god:~$ echo "${#options[@]}"
5
|
|
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11278
|
Man kann einen Array mit einem anderen Array auch so erweitern:
| a=(foo bar)
a+=(baz)
echo $a
|
|
|
michahe
(Themenstarter)
Anmeldungsdatum: 12. Dezember 2013
Beiträge: 874
|
Danke,
Wo genau ist das Problem?
| $ options=($optionsSEL "$dryrun")
$ echo "${options[@]}"
--verbose --info=progress2 --recursive --rsh='ssh' --dry-run
$ echo "${#options[@]}"
|
Soweit klar, aber mit
| $ rsnyc "${#options[@]}" $__source $__target
|
hatte ich eine Fehlermeldung. Ich kann erst morgen daran weiter arbeiten ...
|
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11278
|
michahe schrieb: Soweit klar, aber mit
| $ rsnyc "${#options[@]}" $__source $__target
|
hatte ich eine Fehlermeldung.
Damit gibt er die Anzahl der Elemente im Array statt den Elementen im Array aus.
Ich denke du willst stattdessen sowas:
| rsnyc "${options[@]}" $__source $__target
|
|
|
michahe
(Themenstarter)
Anmeldungsdatum: 12. Dezember 2013
Beiträge: 874
|
Danke seahawk1986, da hatte ich Ostereier auf den Augen. Trotzdem habe ich noch Probleme mit dem Array, zunächst die manuelle Variante:
$option=("$DryRun" --verbose --info=progress2 --recursive --include-from='/home/BenutzerName/Backup-rsyncINEXclude.list' --rsh='ssh' # gekürzt
$ echo ${option[@]
--dry-run --verbose --info=progress2 --recursive --include-from=/home/BenutzerName/Backup-rsyncINEXclude.list --rsh=ssh
$ rsync "${option[@]}" $__Source $__Target
Wieso verschwinden die Hochkomma '? rsync hier ohne Fehler ... Jetzt die Variante mit den per Skript gesammelten Optionen in OptionsSel:
$ echo $OptionsSel
--verbose --info=progress2 --recursive --include-from='/home/BenutzerName/Backup-rsyncINEXclude.list' --rsh='ssh'
$ OptionsFIN=("$DryRun" $OptionsSel)
{{{echo ${OptionsFIN[@]}
--dry-run --verbose --info=progress2 --recursive --include-from='/home/BenutzerName/Backup-rsyncINEXclude.list' --rsh='ssh'
rsync "${OptionsFIN[@]}" $__Source $__Target
Die Hochkomma bleiben erhalten (Unterschied zu oben?), rsync meldet Fehler failed to open include file '/home/BenutzerName/Backup-rsyncINEXclude.list' Wegen möglicher Sonder- / Leerzeichen möchte ich des "Quoten" der Filenamen erhalten. Danke!
|
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11278
|
michahe schrieb: Wegen möglicher Sonder- / Leerzeichen möchte ich eine Maskierung der Filenamen erhalten.
Du willst ja die Argumente für den Array auftrennen, und nicht zusätzliche Zeichen in den Pfad einführen. Ich würde die einfachen Anführungszeichen um das vollständige Argument herum setzen - solange du den Array mit "${OptionsFIN[@]}" entpackst - die doppelten Anführungszeichen sind wichtig, damit die Array-Elemente nicht am IFS aufgetrennt werden - sollte es passen - vgl.: $ a=('foo bar' '--baz=ham spam')
$ for i in ${a[@]}; do printf "%s\n" "$i"; done
foo
bar
--baz=ham
spam
$ for i in "${a[@]}"; do printf "%s\n" "$i"; done
foo bar
--baz=ham spam
|
|
michahe
(Themenstarter)
Anmeldungsdatum: 12. Dezember 2013
Beiträge: 874
|
Danke seahawk1986, ich bin unsicher, ob ich alles richtig verstanden habe; ich habe das so geschrieben, trotzdem Fehlermeldung:
$ OptionsSel="--verbose --info=progress2 --recursive '--include-from=/home/BenutzerName/Backup-rsyncINEXclude.list' --rsh='ssh'"
$ OptionsFIN=("$DryRun" $OptionsSel)
$ rsync "${OptionsFIN[@]}" $__Source $__Target
rsync: change_dir ".../Backup-rsync//'--include-from=/home/BenutzerName/Backup-rsync" failed: No such file or directory (2)
OptionsSel ohne die Hochkomma bei include funktioniert ohne Fehler. Ratlose Grüße aus Freising, Michael
|
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11278
|
Du musst da schon einen Array draus machen:
| OptionsSel=('--verbose' '--info=progress2' '--recursive' '--include-from=/home/BenutzerName/Backup-rsyncINEXclude.list' '--rsh=ssh')
OptionsFIN=("$DryRun" "${OptionsSel[@]}")
$ rsync "${OptionsFIN[@]}" $__Source $__Target
|
Wobei ich nicht weiß, wie rsync auf ein leeres Argument reagiert - im Zweifelsfall würde ich das anders lösen:
| [ -n "$DryRun" ] && Options=("$DryRun")
Options+=('--verbose' '--info=progress2' '--recursive' '--include-from=/home/BenutzerName/Backup-rsyncINEXclude.list' '--rsh=ssh')
$ rsync "${Options[@]}" $__Source $__Target
|
|
|
michahe
(Themenstarter)
Anmeldungsdatum: 12. Dezember 2013
Beiträge: 874
|
Danke, das Du musst da schon einen Array draus machen:
| OptionsSel=('--verbose' '--info=progress2' '--recursive' '--include-from=/home/BenutzerName/Backup-rsyncINEXclude.list' '--rsh=ssh')
OptionsFIN=("$DryRun" "${OptionsSel[@]}")
$ rsync "${OptionsFIN[@]}" $__Source $__Target
|
funktioniert. Jetzt muss ich es noch schaffen, den vorhandenen String OptionsSel in das Array OptionsFIN zu wandeln. Mein bisheriger Fehlversuch:
OptionsSel="'--verbose' '--info=progress2' '--recursive' '--include-from=/home/BenutzerName/Backup-rsyncINEXclude.list' '--rsh=ssh'"
[ -n "$DryRun" ] && OptionsFIN=("$DryRun")
OptionsFIN+=($OptionsSEL)
echo "${OptionsFIN[@]}"
--dry-run
DryRun wird richtig übernommen, der Rest fehlt noch ...
|
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11278
|
michahe schrieb: Mein bisheriger Fehlversuch:
OptionsSel="'--verbose' '--info=progress2' '--recursive' '--include-from=/home/BenutzerName/Backup-rsyncINEXclude.list' '--rsh=ssh'"
[ -n "$DryRun" ] && OptionsFIN=("$DryRun")
OptionsFIN+=($OptionsSEL)
echo "${OptionsFIN[@]}"
--dry-run
Man muss die Variablen schon einheitlich benennen... | unset OptionsFIN
OptionsSEL=('--verbose' '--info=progress2' '--recursive' '--include-from=/home/BenutzerName/Backup-rsyncINEXclude.list' '--rsh=ssh')
[ -n "$DryRun" ] && OptionsFIN=("$DryRun")
OptionsFIN+=("${OptionsSEL[@]}")
echo "${OptionsFIN[@]}"
|
|
|
michahe
(Themenstarter)
Anmeldungsdatum: 12. Dezember 2013
Beiträge: 874
|
Danke seahawk1986, ich bitte um Entschuldigung für meinen dummen Fehler. Trotzdem komme ich nicht auf die Lösung den vorhandenen String ... in das Array ... zu wandeln
Dein Startpunkt ein Array:
Var1=('--verbose' '--info=progress2')
echo "Var1: ${Var1[@]}"
Var1: --verbose --info=progress2 # Hochkomma verschwunden
Mein Startpunkt ein String:
Var2="'--verbose' '--info=progress2'"
Var3=($Var2) # gleiches Ergebnis für Var3=("$Var2")
echo "Var 2: $Var2"
echo "Var 3: ${Var3[@]}"
Var 2: '--verbose' '--info=progress2' # mit Hochkomma
Var 3: '--verbose' '--info=progress2'
|
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11278
|
Du brauchst die einfachen Anführungszeichen nicht mehr, sobald du den String als Element im Array hast (und in der Folge sauber quotest, wenn du auf die Array-Elemente zugreifst). Wenn du die einfachen Anführungszeichen mitschleppen würdest, bräuchtest du ein zusätzliches eval, um die wieder loszuwerden, bevor rsync mit den Argumenten etwas sinnvolles anfangen kann - die sind nur nötig, damit die Shell den String bei der Eingabe weder expandiert noch evaluiert, sondern als eine zusammengehörige Zeichenkette ansieht. echo ist ein suboptimales Hilfsmittel, um zu sehen, wie die Elemente eines Array vorliegen, mit printf geht das schöner, so druckt er z.B. jedes Element aus dem Array in einer eigenen Zeile (und rsync würde die einzelnen Argumente dann auch genau mit dieser Auftrennung bekommen):
$ Var1=('--verbose' '--info=progress2')
$ printf "%s\n" "${Var1[@]}"
--verbose
--info=progress2
|
|
michahe
(Themenstarter)
Anmeldungsdatum: 12. Dezember 2013
Beiträge: 874
|
Sorry, ich kapier's nicht: ... sobald du den String als Element im Array hast ... Wenn du die einfachen Anführungszeichen mitschleppen würdest, ...
Genau das ist ja das Problem: Du startest mit dem Array, die Elemente in Hochkomma. Die Ausgabe (Danke für den Hinweis auf printf) zeigt die Elemente ohne Hochkomma → rsnyc ohne Fehler. Ich starte mit dem String, ebenfalls die die Elemente in Hochkomma. Die Ausgabe, auch nach Umwandeln in Array, zeigt die Elemente mit Hochkomma → rsnyc mit Fehler. Also im Ursprungsstring alle Hochkomma raus (außer ssh)? Wäre dann einmal ein Leerzeichen in einem Dateinamen, hab' ich ein Problem ...
Var1=(--verbose --info=progress2 und 3); printf "%s\n" "${Var1[@]}"
--verbose
--info=progress2
und
3
Ich könnte beim Einsammeln der Optionen diese gleich in das 0..n-te Element eines Array schreiben statt sie an die Variable anzuhängen; wegen der Größe des Umbaus wollte ich das jetzt (eigentlich) nicht machen ...
|
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11278
|
michahe schrieb: Ich starte mit dem String, ebenfalls die die Elemente in Hochkomma.
Aber aus welchem Grund machst du das, wenn am Ende ein Array rauskommen soll? Arrays haben genau den Zweck mehrere Elemente sauber getrennt zu halten...
Ich könnte beim Einsammeln der Optionen diese gleich in das 0..n-te Element eines Array schreiben statt sie an die Variable anzuhängen; wegen der Größe des Umbaus wollte ich das jetzt (eigentlich) nicht machen ...
Wie schon gezeigt, kannst du einen Array auch einfach bequem schrittweise erweitern - das funktioniert ähnlich wie bei einem String:
$ array=('--verbose')
$ array+=('--info=progress2')
$ array+=('--recursive')
$ array+=('--include-from=/home/BenutzerName/Backup-rsyncINEXclude.list')
$ array+=('--rsh=ssh')
$ printf "%s\n" "${array[@]}"
|