Kann ich die Variable $ 1 deaktivieren?

7

Ist es möglich, die Variable $ 1 zu deaktivieren? Wenn nicht, kann ich nicht herausfinden, wo es erklärt wird man.

[root@centos2 ~]# set bon jour
[root@centos2 ~]# echo $1$2
bonjour
[root@centos2 ~]# unset $1
[root@centos2 ~]# echo $1$2
bonjour
[root@centos2 ~]#

BEARBEITEN:

man set option double-dashSchließlich habe ich in man ( ) Folgendes herausgefunden, um alle Positionsparameter zu leeren (und der Mann hat das Wort "unset" verwendet!):

Wenn dieser Option keine Argumente folgen, werden die Positionsparameter nicht festgelegt.

[root@centos2 ~]# echo $1

[root@centos2 ~]# set bon jour
[root@centos2 ~]# echo $1$2
bonjour
[root@centos2 ~]# set --
[root@centos2 ~]# echo $1$2

[root@centos2 ~]#

Die Antwort von @Jeff Schaller hat mir geholfen, das zu verstehen.

Pozinux
quelle
4
Ich bin mir nicht sicher, was Sie fragen, aber Sie könnten 'Shift' verwenden, um $ 2 an die Stelle von $ 1 zu setzen und somit $ 1 zu entfernen. EDIT: Kusalananda hat unten eine ausführlichere Antwort.
Bitofagoob
Sie haben Recht, meine Frage ist nicht gut formuliert. Ich suchte nach einer Möglichkeit, eine Positionsvariable zu leeren, wenn ich sie festgelegt hatte.
Pozinux

Antworten:

20

Sie können es nicht deaktivieren, aber Sie können wechseln $2in $1:

$ set bon jour
$ echo "$1$2"
bonjour

$ shift
$ echo "$1$2"  # $2 is now empty
jour

shiftverschiebt alle Positionsparameter einen Schritt tiefer. Es ist üblich, dass z. B. Befehlszeilen-Parsing-Schleifen (die / nicht verwenden ) die Positionsparameter in jeder Iteration verschieben, während der Wert von wiederholt untersucht wird . Es ist ungewöhnlich, einen Positionsparameter deaktivieren zu wollen.getoptgetopts$1

By the way, unsetnimmt einen variablen Namen , nicht seinen Wert, so unset $1wird in der Tat ungesetzt die Variable bon(hatte es zuvor eingestellt worden ist ).

Kusalananda
quelle
Was ist, wenn ich 1 $ leeren möchte? Auch ein guter Punkt auf die Tatsache, dass es sein würde unset bon. Daran habe ich nicht gedacht.
Pozinux
@Pozinux Das wäre eine ziemlich ungewöhnliche Sache. Was ist das Problem, das Sie lösen möchten?
Kusalananda
Tatsächlich lerne ich. Ich habe versucht zu verstehen, wie es setfunktioniert. Ich habe dieses Beispiel mit "bonjour" versucht, konnte aber keinen Weg finden, diese Variable zu leeren. Ich habe ein bisschen mit Unset gemischt. Wahrscheinlich, weil ich noch nicht das ganze Konzept über Set, Unset, Env, Export usw. bekommen habe
Pozinux
1
@Pozinux Nun, wenn Sie sie erneut einstellen, werden sie überschrieben, wie Jeff in seiner Antwort zeigt.
Kusalananda
Wenn Sie getoptoder getoptsSie tun Verwendung shift.
Bis auf weiteres angehalten.
15

Sie können es leeren , indem Sie die Parameter auf "die leere Zeichenfolge" zurücksetzen, gefolgt von "den Parametern, beginnend mit der zweiten":

$ set -- 1 2 3 4
$ printf -- "->%s<-\n" "$@"
->1<-
->2<-
->3<-
->4<-
$ set -- "" "${@:2}"
$ printf -- "->%s<-\n" "$@"
-><-
->2<-
->3<-
->4<-
Jeff Schaller
quelle
Ihre Antwort ist auch nett und richtig, aber ich habe aufgrund meiner kleinen Muschelebene mehr Zeit gebraucht, um sie zu verstehen ... Tatsächlich hat es mir geholfen, etwas über die Option "-" herauszufinden, die ich nicht kannte (siehe meine auf meine Frage bearbeiten). Vielen Dank.
Pozinux
6

Neben all den richtigen technischen Antworten sollten Sie feststellen, dass Ihre Frage einen logischen Fehler enthält. $ 1, $ 2, ... sind nicht die Werte benannter Variablen wie $ A, $ B, ..., sondern der 1., 2., ... Wert einer Werteliste. Vielleicht ist der erste Wert einer Liste eine leere Zeichenfolge, aber es ist nicht sinnvoll zu sagen, dass meine Liste keinen ersten Wert hat. Wenn eine Liste keinen ersten Wert hat, hat sie überhaupt keinen Wert und ist daher eine leere Liste.

Sie können also den ersten Wert einer Liste nicht "deaktivieren". Sie können nur den ersten Wert aus einer Liste entfernen. Dann ist der frühere 2. Wert der Liste jetzt der 1. Wert der Liste, der frühere 3. Wert ist jetzt der 2. und so weiter. Genau das macht der Schichtführer.

Wunder173
quelle
Obwohl zur Kenntnis , dass die tatsächlichen Arrays nicht fortlaufend von Null werden muß indiziert, könnten Sie gehen unset A; A[4]=foo; A[7]=bar;und Urlaub mit A[0]unter anderem ungesetzt (nicht nur leer). Und dann unset A[4]. Aber ich schweife ab, das gilt nicht für die Positionsparameter.
Ilkkachu
@ miracle173, du hast recht, es macht keinen Sinn. Ich dachte, dass unset auch verwendet wird, um eine Variable zu leeren.
Pozinux
@ilkkachu A ist ein Array und keine Werteliste. A [0], A [1], ... ähneln Variablen und können daher leer sein
miracle173
4

Nein, zumindest nicht direkt. Diese Syntax sollte funktionieren, führt jedoch zu einem Fehler:

$ set bon jour
$ echo $1 $2
$ unset 1
1: not a valid identifier

unset $variableist in der Regel ein Fehler und unset variablewar das, was beabsichtigt war. Leider funktioniert es hier nicht.

Joshua
quelle