2016-07-26 18 views
0

Ich versuche, über eine Fisch-Shell-Liste zu iterieren und die Werte der Elemente zu ändern, die diese neuen Werte in dieser Liste speichern.Ändern der Werte von Listen in Schleife mit Fisch Shell Skript

Die ursprüngliche Liste wird wie folgt aufgefüllt:

set -l dockApplications (ls $HOME/.config/plank/dock1/launchers/) 

Dies funktioniert und eine Liste wie folgt erzeugt:

emacsclient.dockitem firefox.dockitem monodevelop.dockitem Thunar.dockitem 

Jetzt möchte ich über sie wiederholen und die Zeichenfolge „dockitem“ ändern "Desktop".

Ich habe eine for-Schleife versucht, aber ich nicht richtig angezeigt verwenden, es zu werden:

for application in $dockApplications 
    echo $application 
    set application (string replace 'dockitem' 'desktop' $application) 
    echo $application 
    echo "===========" 
end 

die richtige Zeichenfolge Diese Echos die vor und nach dem String-Operation und ich produzieren. aber wenn ich etwas wie echo $dockApplications nach der for-Schleife mache. Ich bekomme die Liste der Zeichenfolgen mit der Erweiterung "dockitem".

Ich habe auch versucht die $dockApplications Variable anders wie Einstellung:

set -l dockApplications (string replace 'dockitem' 'desktop' (ls $HOME/.config/plank/$dockdir/launchers/)) 

aber das scheint die gleiche Liste von Strings mit dem „dockitem“ Erweiterung zurückzukehren.

Ich glaube, ich verstehe grundsätzlich nicht, wie Variablen zugewiesen sind oder wie ihr Umfang hier gehandhabt wird.

Ich habe mich nie vollständig mit dem Shell-Scripting beschäftigt. Ich kann es lesen und verstehen, was vor sich geht, aber wenn es darum geht, es umzusetzen, treffe ich ein paar Straßenblockaden, wenn ich versuche, etwas auf eine Weise zu erreichen, die ich in einer anderen Sprache hätte. Aber ich erkenne die Macht des Shell-Skripts und möchte es besser machen. Also alle Hinweise, wie dies in einer Fischschale idiomatische Weise zu tun ist, werden sehr geschätzt.

+0

Was mir geholfen hat, Shell-Sprachen zu beherrschen, ist, das Handbuch immer bei mir zu haben s. –

+0

Die 'Anwendung' var bekommt keine Referenz auf den ursprünglichen Wert, sie erhält eine Kopie des Wertes. Sie ändern also eine Kopie des ursprünglichen Werts. Zusätzlich zu den von Glenn angebotenen Lösungen würde ich empfehlen, das ursprüngliche Array nicht zu verändern. Erstellen Sie ein neues Array, wenn Sie über das Original iterieren. –

Antwort

4

Ich würde iterieren die Indizes der Liste, so dass Sie an Ort und Stelle aktualisieren:

set apps (printf "%s\n" ./launchers/*.dockitem) 
for i in (seq (count $apps)) 
    set apps[$i] (string replace "dockitem" "desktop" $apps[$i]) 
end 
printf "%s\n" $apps 

Dies auch ohne Schleife funktioniert:

set apps (string replace dockitem desktop (printf "%s\n" ./launchers/*.dockitem)) 
printf "%s\n" $apps 

Wenn ich mich erinnere, Fisch spaltet die Ausgabe einer Befehlsersetzung auf Zeilenumbrüchen beim Speichern in einem Array

+0

Danke das funktioniert! Ich erkannte auch, dass eine meiner Lösungen auch funktioniert, aber ich schrieb "Dock" falsch. – Jesse

+1

Es gibt keine Notwendigkeit für die 'printf', und es fügt sogar einen (meist theoretischen) Fehler hinzu, wenn Dateinamen Zeilenumbrüche enthalten. Setzen Sie einfach die Apps ./launchers/ *. Dockitem' direkt. – faho

+1

Wenn Sie sich wirklich keine Gedanken über Zeilenumbrüche machen, können Sie 'set apps (string replace" dockitem "" desktop "- ./launchers/ *. Dockitem)' direkt aufrufen und die Schleife komplett überspringen. – faho