Frage Flexibler Vektoraufbau in Tcsh


Vektorerzeugung ist eine Technik, die es uns erlaubt, Listen zu erzeugen, ohne Iteratoren und Schreibschleifen zu definieren. Sie sind in vielen Situationen nützlich und können Code viel prägnanter und kompakter machen. Sie erleichtern auch die schnelle Zusammensetzung komplexerer Konstrukte über command expansion.

Hier ist ein Beispiel: Ich habe ein Programm, das auf mehreren Host-Argumenten arbeitet. Ich muss eine Liste von Hostnamen generieren, in die eine fortlaufende Nummer eingebettet ist, z.

a1z a2z a3z a4z a5z

Im bash man kann schreiben:

$ progname a{1..5}z

was sich erweitern wird zu:

$ progname a1z a2z a3z a4z a5z

Im tcsh, die diese nützliche Argument-Vektor-Generation-Funktion fehlt, können wir manchmal verwenden seq. Unglücklicherweise, seq ist nur auf Zahlen beschränkt. man seq sagt, dass seq unterstützt a --format Argument, aber es scheint nicht das wirklich nützliche Ding zu tun (willkürliche Formate einschließlich einer Zahl erlaubend). Stattdessen kann nur das Gleitkommaformat einer Zahl geändert werden (schade).

Natürlich können wir die Erweiterung an delegieren bash + echo mit beiden command expansion und Zitieren des Ganzen bash -c Streit:

tcsh> progname `bash -c "echo a{1..5}z"`

Analog könnten wir die String-Vektor-Generierung an delegieren groß Dienstprogramme wie awk, perl, python, lisp, oder R mit `` (Befehlserweiterung).

Die Frage ist: Gibt es noch andere? einfach Möglichkeiten, solche Vektoren zu generieren tcsh. Mit "einfach" meine ich ein kleines Dienstprogramm wie seqoder noch besser, ein eingebautes Shell-Konstrukt, und ohne auf Schreib-Schleifen zurückgreifen zu müssen oder die Vektorgenerierung an "große" Programme wie z bash/awk/clisp/perl/python/R?


2
2018-04-08 21:45


Ursprung




Antworten:


Sie können die Ausgabe von seq.

progname `seq 5 | sed -e 's/^/a/' -e 's/$/z/'`

Sie können die Historienersetzung verwenden, um allen Elementen eines Arrays ein Präfix hinzuzufügen:

set a = (`seq 5`)
progname ${a:s//a/}

Ich weiß nicht, wie man ein Suffix hinzufügt, aber ich bin kein Tcsh-Experte.


Tcsh ist in diesem Jahrhundert ziemlich tot und wurde schon früher als weniger geeignet für das Scripting als Bourne-artige Shells erkannt. Wie wäre es mit zsh?

a=($(seq 5))
progname a${^a}z

2
2018-04-08 22:16



Danke Gilles. Nur um den zsh-Vorschlag zu verfolgen: ich benutze nie tcsh für das Scripting. Die Dateiumleitung ist schmerzhaft und inkonsistent, die Syntax der Flusssteuerung ist grob und Newline-empfindlich, aber in der interaktiven Arbeit finde ich sie in mehreren Bereichen immer noch überlegen. Ein Beispiel ist die Unterstützung von Alias-Argumenten. Siehe zum Beispiel: stackoverflow.com/questions/14966102 - arielf
@arielf Alias ​​Argumente sind irgendwie sinnlos, man kann normalerweise eine Funktion schreiben. Ihr arithmetischer Alias ​​basiert nicht nur auf Alias-Argumenten, sondern auf der seltsamen Art, wie sie durch die Ersetzung von Historien implementiert wird. - Gilles