Posso desfazer a variável $ 1?

5

É possível cancelar a variável $ 1? Se não, não posso descobrir onde é explicado em man .

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

EDITAR:

Finalmente, aqui está o que eu descobri no homem ( man set option double-dash ) para esvaziar todos os parâmetros posicionais (e o homem usou a palavra "unset"!):

If no arguments follow this option, then the positional parameters are unset.

[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 ~]#

É a resposta do @Jeff Schaller que me ajudou a entender isso.

    
por Pozinux 17.05.2017 / 22:41

4 respostas

19

Você não pode desmarcá-lo, mas pode alterar $2 para $1 :

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

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

shift mudará todos os parâmetros posicionais um passo abaixo. É comum, por exemplo, loops de análise de linha de comando (que não usam getopt / getopts ) para alterar os parâmetros posicionais em cada iteração enquanto examina repetidamente o valor de $1 . É incomum querer remover um parâmetro posicional.

A propósito, unset usa uma variável nome , não seu valor, então unset $1 irá, na verdade, desfazer a variável bon (se ela já tivesse sido definida).

    
por 17.05.2017 / 22:46
15

Você poderia esvaziar , reajustando os parâmetros para: "a string vazia" seguida por "os parâmetros, começando a partir da segunda":

$ set -- 1 2 3 4
$ printf -- "->%s<-\n" "$@"
->1<-
->2<-
->3<-
->4<-
$ set -- "" "${@:2}"
$ printf -- "->%s<-\n" "$@"
-><-
->2<-
->3<-
->4<-
    
por 17.05.2017 / 23:11
6

Além de todas as respostas técnicas corretas, você deve notar que há uma falha lógica em sua pergunta. $ 1, $ 2, ... não são os valores de variáveis nomeadas como $ A, $ B, ..., mas o primeiro, segundo, ... valor de uma lista de valores. Talvez o primeiro valor de uma lista seja uma string vazia, mas não faz sentido dizer que minha lista não tem valor inicial. Se uma lista não tiver o primeiro valor, ela não terá valor algum e, portanto, será uma lista vazia.

Assim, você não pode "desfazer" o primeiro valor de uma lista. Você só pode remover o primeiro valor de uma lista. Então o segundo valor anterior da lista é agora o primeiro valor da lista, o primeiro é agora o segundo e assim por diante. Isso é exatamente o que o operador de turno faz.

    
por 18.05.2017 / 07:18
4

Não, pelo menos não diretamente. Esta sintaxe deve funcionar, mas produz um erro:

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

unset $variable costuma ser um erro e unset variable era o que pretendia. Infelizmente não funciona aqui.

    
por 18.05.2017 / 03:17