Formas de definir parâmetros posicionais no bash

2

De link

set [--abefhkmnptuvxBCEHPT] [-o option-name] [argument …]
set [+abefhkmnptuvxBCEHPT] [+o option-name] [argument …]

...

-- If no arguments follow this option, then the positional parameters are unset. Otherwise, the positional parameters are set to the arguments, even if some of them begin with a ‘-’.

- Signal the end of options, cause all remaining arguments to be assigned to the positional parameters. The -x and -v options are turned off. If there are no arguments, the positional parameters remain unchanged.

Using ‘+’ rather than ‘-’ causes these options to be turned off. The options can also be used upon invocation of the shell. The current set of options may be found in $-.

The remaining N arguments are positional parameters and are assigned, in order, to $1, $2, … $N. The special parameter # is set to N.

Parece que há três maneiras de definir os parâmetros de posição:

set -- argument
set - argument
set argument

Quais são as diferenças deles?

Obrigado.

    
por Tim 14.07.2017 / 23:56

2 respostas

5

A diferença entre -- e - é que quando - é usado, as opções -x e -v também não são definidas.

$ set -vx
$ echo "$-"
himvxBHs                # The options -v and -x are set.

$ set - a b c
$ echo "$-  <>  $@"     # The -x and -v options are turned off.
himBHs  <>  a b c

Essa é a maneira usual em que os shells aceitam o - , no entanto, no POSIX, essa opção é "não especificada":

If the first argument is '-', the results are unspecified.

A diferença entre set -- e plain set é bastante comumente usada.
Está claramente explicado no manual:

-- If no arguments follow this option, then the positional parameters are unset. Otherwise, the positional parameters are set to the args, even if some of them begin with a -.

O sinal - o "fim das opções" e qualquer argumento que se segue mesmo que comece com um - será usado como um argumento posicional.

$ set -- -a -b -e -f arg1
$ echo "$@"
-a -b -e -f arg1

Em vez disso:

$ set -a -b -e -f arg1
$ echo "$@"
arg1

Mas também algumas opções de shell foram alteradas.

Não usar nenhum de - ou - permitirá a configuração de opções de conjunto com variáveis que se expandem para nomes de opções (mesmo que citadas):

$ echo "$-"
himBHs

$ a='-f'
$ set "$a"

$ echo "$-"
fhimBHs
    
por 15.07.2017 / 03:40
6

A diferença entre set argument e set -- argument é comum a muitos outros comandos.

Você algumas vezes tem um argumento que começa com - , mas você não pode realmente usá-lo porque o comando pensa (porque começa com - ) que é realmente uma opção de comando.

O que o -- diz é efetivamente: "Basta! tudo o que se segue, mesmo que comece com - , é um argumento real".

Geralmente (de acordo com as páginas de manual), um único - é equivalente a -- para esse propósito.

Exemplo

Você pode usar:

set -- -a -b file1 file2  

para definir $1 , $2 , $3 e $4 a -a , -b , file1 e file2 , respectivamente. O -- não é armazenado - é apenas um indicador; sem isso, o -a e -b seria interpretado como possível opção para o comando set em si.

    
por 15.07.2017 / 01:49

Tags