Übergabe von (optionalen) Unix-Shell-Textparametern ohne Erweiterung

495
ihatesh

Ich möchte ein Unix- / Linux-Skript updategit.shmit einem Standardparameter schreiben, der für git festgelegt wird. updategit.shsollte POSIX-kompatibel sein. Ich hoffe, dass POSIX einige der schlimmsten Inkompatibilitäten der Unix / Linux-Shells löst.

Syntax: updategit.sh {$1}

{$1} bezeichnet den Parameter $1 optional ist.

1) Wenn an updategit.shdie letzte Aktion im Skript kein Parameter übergeben wird, sollte Folgendes gelten:

git commit -m 'Patches #1023, #1016.4 .. .17 reapplied. See e-mail from Paul (paul@sh.ts) send at 2016-01-26 08:56' 

Reicht es aus, es in einfachen Anführungszeichen zu übergeben, wenn der Text kein einzelnes Anführungszeichen enthält?

2) Es sollte möglich sein, einen optionalen Parameter an $1zu übergeben updategit.sh. Die natürliche Syntax wäre, den Parameter in Anführungszeichen zu setzen. Ich denke das wird nicht möglich sein. Ich möchte in der Lage sein, so viel wie möglich zu bekommen, updategit.shohne dass die Shell den Eingabeparameter zerstört und der Befehl aufgrund der Shell, die mit der Eingabe durcheinander wirft, fehlschlägt.

Die natürliche Syntax wäre etwa so:

$ ./updategit.sh "New template GetShape()" $ ./updategit.sh "Patch #312.5 applied. See Eve's email (eve@stoneage.nix) from 2016-02.29 09:43" $ ./updategit.sh "Round to .5 fixed" $ ./updategit.sh 

Es ist klar, dass die Shell die Eingabe durcheinander bringt. Wie nahe könnte ich an die "natürliche" Syntax kommen, ohne git commit -m $1versagen zu können? AFAIK der Befehl git commit -m $1muss etwas robuster geschrieben werden.

0

1 Antwort auf die Frage

1
Ouroborus

Technisch sind alle Argumente für Shell-Skripts optional. Das Skript entscheidet, ob Argumente fehlen und was dagegen zu tun ist. Dies kann je nach Ihren Anforderungen auf verschiedene Arten erfolgen. Für ein Skript, das nur ein optionales Argument hat, würde Folgendes funktionieren:

#!/usr/bin/env sh if [ ${#1} -eq 0 ] then git commit -m "default message" else git commit -m "$1" fi 

Dies prüft, ob die Länge des ersten Arguments Null ist und entsprechend wirkt. Wenn das erste Argument fehlt, zählt es als Länge Null. Sie können auch die Anzahl der Argumente überprüfen, indem Sie mit dem Argument vergleichen $#.

Eine kürzere Variante des obigen Skripts, die die Ersetzung leerer Argumente nutzt, ist:

#!/usr/bin/env sh git commit -m "$" 

Dies wird hier unter "2.6.2 Parametererweiterung" beschrieben.

Eine einfachere Version wäre `if [! "$ 1"] `. Achten Sie auf den Leerraum um `[` und `]` - es ist ein _Befehl_, keine magische Sprachsyntax. grawity vor 8 Jahren 1
@Grawity behoben ... Ouroborus vor 8 Jahren 0