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 esse comando está fazendo?
shift $(($optind - 1))
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 esse comando está fazendo?
shift $(($optind - 1))
Respostas:
shift $((OPTIND-1))
(nota OPTIND
é maiúscula) normalmente é encontrado imediatamente após um getopts
while
loop. $OPTIND
é o número de opções encontradas por getopts
.
Como pauljohn32 menciona nos comentários, estritamente falando, OPTIND
fornece a posição do próximo argumento da linha de comando.
No Manual de Referência do GNU Bash :
getopts optstring nome [args]
getopts
é usado por scripts de shell para analisar parâmetros posicionais.optstring
contém os caracteres de opção a serem reconhecidos; se um caractere for seguido por dois pontos, espera-se que a opção tenha um argumento, que deve ser separado por espaço em branco. Os dois pontos (':') e o ponto de interrogação ('?') Não podem ser usados como caracteres de opção. Sempre que é chamado,getopts
coloca a próxima opção no nome da variável do shell, inicializandoname
se não existir, e o índice do próximo argumento a ser processado na variávelOPTIND
.OPTIND
é inicializado como 1 sempre que o shell ou um script de shell é chamado. Quando uma opção requer um argumento, getopts coloca esse argumento na variávelOPTARG
. O shell não é redefinidoOPTIND
automaticamente; ele deve ser redefinido manualmente entre várias chamadas paragetopts
dentro da mesma invocação de shell se um novo conjunto de parâmetros for usado.Quando o final das opções é encontrado,
getopts
sai com um valor de retorno maior que zero.OPTIND
é definido como o índice do primeiro argumento não opcional e o nome é definido como '?'.
getopts
normalmente analisa os parâmetros posicionais, mas se houver mais argumentosargs
,getopts
analisa-os.
shift
n
remove n strings da lista de parâmetros posicionais. Assim, shift $((OPTIND-1))
remove todas as opções analisadas getopts
da lista de parâmetros e, depois desse ponto, $1
se refere ao primeiro argumento de não opção transmitido para o script.
Atualizar
Como mikeserv menciona no comentário, shift $((OPTIND-1))
pode não ser seguro. Para evitar a divisão indesejada de palavras, etc, todas as expansões de parâmetro devem ser citadas duas vezes. Portanto, o formulário seguro para o comando é
shift "$((OPTIND-1))"
find
) podem parecer que permitem opções após não-opções, mas não o fazem: eles têm operandos que começam com um traço.
IFS
, mas é melhor prevenir do que remediar. ;)
IFS=0123456789
,shift $((OPTIND-1))
(sem aspas) se transformará no shift ""
que será silenciosamente ignorado (in ksh
) ou gerará um erro (in bash
e dash
).
$((...))
apenas calcula coisas. No seu caso, leva o valor de $optint
e substracts 1.
shift
remove parâmetros posicionais. No seu caso, ele remove optint-1
parâmetros.
Para mais informações dê uma olhada help getopts
, help shift
, olhada man bash
para "Expansão Aritmética", e especialmente o Google para getopts
.