Fügen Sie eine benutzerdefinierte Variable in einen Alias ​​in Bash ein


7

Ich möchte einem Befehl in meiner .bashrcDatei einen Alias ​​hinzufügen , wie in diesem Beispiel:

alias take_row="cat prova.csv_001.txt | awk -v nrow="${nrow}" '{if (NR==nrow) print}'"

Ich möchte die nrowVariable jedoch angeben , wenn ich den Befehl vom Terminal aus starte. Als Beispiel:

take_row 1 -> Das Skript nimmt die erste Zeile

take_row 20 -> Das Skript nimmt die 20. Zeile ein

Wie schreibe ich in den Befehl so etwas <command> | <read nrow user input>usw.?

Antworten:


12

Verwenden Sie eine Funktion anstelle eines Alias. In diesem Fall können Sie auf Positionsparameter wie $1usw. verweisen .

take_row () {
    local nrow=$1
    cat prova.csv_001.txt | awk -v nrow="${nrow}" '{if (NR==nrow) print}'
}

In diesem speziellen Fall können Sie auch die nutzlose Verwendung von Katze ansprechen :

take_row () {
    local nrow=$1
    awk -v nrow="${nrow}" '{if (NR==nrow) print}' prova.csv_001.txt
}

Besser noch, verwenden Sie ein externes Shell-Skript, das beispielsweise in ~ / bin gespeichert ist.
jrw32982 unterstützt Monica

1
@ jrw32982 Ein externes Skript unterliegt Einschränkungen. Sie können beispielsweise keine Verzeichnisse ändern oder die Umgebung der aktuellen Shell ändern, was ein Alias ​​und eine Funktion tun können. Wenn jedoch keines dieser Elemente benötigt wird, dann ja Ein externes Skript ist möglich.
Filbranden

1
Meine These ist, dass ein externes Shell-Skript praktisch immer einem Alias ​​oder einer von .bashrc definierten Funktion vorgezogen werden sollte, es sei denn, es gibt eine Einschränkung, die aus einem ähnlichen Grund wie dem von Ihnen vorgeschlagenen einen Alias ​​oder eine Funktion erfordert. Im vorliegenden Fall scheint es keinen Grund zu geben, der die Verwendung eines externen Skripts verhindern würde, und daher ist dies die bevorzugte Lösung.
jrw32982 unterstützt Monica

2
@ jrw32982 Wenn Sie der Meinung sind, dass die Leute Ihren Rat befolgen sollten, wäre es hilfreich, wenn Sie erklären, warum.
B-Schicht

@ BLayer Grundsätzlich liegt es daran, dass externe Befehle die Grundeinheit sind. Warum sollte jede interaktive Shell in den Speicher geladen werden und eine Sammlung von Aliasnamen und Funktionen enthalten, die für diese Sitzung keinen Zweck erfüllen? Externe Befehle werden bei Bedarf aufgerufen, anstatt vorgeladen zu werden. Externe Befehle können einfacher getestet, neu geladen usw. werden. Es gibt ganze Entwicklungskulturen und -umgebungen zum Erstellen und Testen externer Befehle und ihrer Komponenten, jedoch nichts für Aliase und Funktionen. Ksh93 hat FPATH, um zu versuchen, Funktionen eher wie Befehle zu machen.
jrw32982 unterstützt Monica
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.