Übergabe des (optionalen) Unix-Shell-Textparameters ohne Erweiterung

0

Ich möchte ein Unix / Linux-Skript updategit.shmit einem Standardparameter schreiben , um git zu bestätigen. updategit.shsollte POSIX-kompatibel sein. Ich hoffe, POSIX behebt einige der schlimmsten Inkompatibilitäten der Unix / Linux-Shells.

Syntax: updategit.sh {$1}

{$1}bedeutet, dass der Parameter $1optional ist.

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

git commit -m 'Patches #1023, #1016.4 .. .17 reapplied. See e-mail from Paul ([email protected]) send at 2016-01-26 08:56'

Reicht es aus, es in einfachen Anführungszeichen zu übergeben, wenn der Text kein einfaches 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 doppelte 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 erreichen, updategit.shohne dass die Shell den Eingabeparameter zerstört und der Befehl fehlschlägt, weil die Shell mit der Eingabe in Unordnung gerät.

Die natürliche Syntax wäre etwa so:

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

Es ist klar, dass die Shell mit der Eingabe durcheinander kommt. Wie nahe könnte ich der "natürlichen" Syntax kommen, ohne git commit -m $1zu scheitern? AFAIK Der Befehl git commit -m $1muss in etwas Robusteres umgeschrieben werden.

ihatesh
quelle

Antworten:

1

Technisch sind alle Argumente zu Shell-Skripten optional. Es liegt am Skript, zu bestimmen, ob Argumente fehlen und was dagegen zu tun ist. Dies kann je nach Bedarf auf verschiedene Arten erfolgen. Für ein Skript mit nur einem optionalen Argument funktioniert Folgendes:

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

Hiermit wird überprüft, ob die Länge des ersten Arguments Null ist, und entsprechend verfahren. Wenn das erste Argument fehlt, hat es die Länge Null. Sie können auch die Anzahl der Argumente mit denen vergleichen $#.

Eine kürzere Variante des obigen Skripts, die die Substitution durch leere Argumente nutzt, ist:

#!/usr/bin/env sh
git commit -m "${1:-default message}"

Dies ist hier unter "2.6.2 Parametererweiterung" beschrieben.

Ouroborus
quelle
1
Eine einfachere Version wäre if [ ! "$1" ]. Achten Sie auf die Leerzeichen [und ]- es ist ein Befehl , keine magische Sprachsyntax.
Grawity
@ Grawity behoben ...
Ouroborus