Explique o comando shell: shift $ (($ optind - 1))

19

Eu não sou um cara do Linux, mas preso em algum script que eu tenho que ler para o meu projeto. Então, alguém pode me ajudar com o que este comando está fazendo?

shift $(($optind - 1))
    
por Gaurav Pant 06.07.2015 / 12:44

2 respostas

33

shift $((OPTIND-1)) (nota OPTIND é maiúscula) é normalmente encontrado imediatamente após um loop getopts while . $OPTIND é o número de opções encontradas por getopts .

Como pauljohn32 menciona nos comentários, estritamente falando, OPTIND fornece a posição do argumento de linha de comando próximo .

Do GNU Manual de Referência do Bash :

getopts optstring name [args]

getopts is used by shell scripts to parse positional parameters. optstring contains the option characters to be recognized; if a character is followed by a colon, the option is expected to have an argument, which should be separated from it by whitespace. The colon (‘:’) and question mark (‘?’) may not be used as option characters. Each time it is invoked, getopts places the next option in the shell variable name, initializing name if it does not exist, and the index of the next argument to be processed into the variable OPTIND. OPTIND is initialized to 1 each time the shell or a shell script is invoked. When an option requires an argument, getopts places that argument into the variable OPTARG. The shell does not reset OPTIND automatically; it must be manually reset between multiple calls to getopts within the same shell invocation if a new set of parameters is to be used.

When the end of options is encountered, getopts exits with a return value greater than zero. OPTIND is set to the index of the first non-option argument, and name is set to ‘?’.

getopts normally parses the positional parameters, but if more arguments are given in args, getopts parses those instead.

shift n
remove n strings da lista de parâmetros posicionais. Assim, shift $((OPTIND-1)) remove todas as opções que foram analisadas por getopts da lista de parâmetros e, após esse ponto, $1 se referirá ao primeiro argumento de não-opção passado para o script.

Atualizar

Como mikeserv menciona o comentário, shift $((OPTIND-1)) pode não ser seguro. Para evitar a divisão indesejada de palavras, etc., as expansões de parâmetro all devem ter aspas duplas. Então, a forma segura para o comando é

shift "$((OPTIND-1))"

    
por 06.07.2015 / 13:33
7

$((...)) apenas calcula as coisas. No seu caso, leva o valor de $optint e substracts 1.

shift remove os parâmetros posicionais. No seu caso, ele remove os parâmetros optint-1 .

Para obter mais informações, consulte help getopts , help shift , consulte man bash para "Expansão aritmética" e, especialmente, pesquise no google getopts .

    
por 06.07.2015 / 12:49