No soy un chico de Linux, pero estoy atrapado en un script que tengo que leer para mi proyecto. Entonces, ¿alguien puede ayudarme en lo que hace este comando?
shift $(($optind - 1))
No soy un chico de Linux, pero estoy atrapado en un script que tengo que leer para mi proyecto. Entonces, ¿alguien puede ayudarme en lo que hace este comando?
shift $(($optind - 1))
Respuestas:
shift $((OPTIND-1))
(la nota OPTIND
es mayúscula) normalmente se encuentra inmediatamente después de un getopts
while
bucle. $OPTIND
es la cantidad de opciones encontradas por getopts
.
Como pauljohn32 menciona en los comentarios, estrictamente hablando, OPTIND
da la posición del siguiente argumento de línea de comando.
Del Manual de referencia de GNU Bash :
getopts optstring name [args]
getopts
es utilizado por los scripts de shell para analizar parámetros posicionales.optstring
contiene los caracteres de opción que se reconocerán; Si un carácter va seguido de dos puntos, se espera que la opción tenga un argumento, que debe estar separado de él por espacios en blanco. Los dos puntos (':') y el signo de interrogación ('?') No se pueden usar como caracteres de opción. Cada vez que se invoca,getopts
coloca la siguiente opción en el nombre de la variable de shell, inicializandoname
si no existe, y el índice del siguiente argumento que se procesará en la variableOPTIND
.OPTIND
se inicializa a 1 cada vez que se invoca el shell o un script de shell. Cuando una opción requiere un argumento, getopts coloca ese argumento en la variableOPTARG
. El shell no se reiniciaOPTIND
automáticamente; debe reiniciarse manualmente entre varias llamadasgetopts
dentro de la misma invocación de shell si se va a utilizar un nuevo conjunto de parámetros.Cuando se encuentra el final de las opciones,
getopts
sale con un valor de retorno mayor que cero.OPTIND
se establece en el índice del primer argumento sin opción y el nombre se establece en '?'.
getopts
normalmente analiza los parámetros posicionales, pero si se dan más argumentosargs
,getopts
analiza en su lugar.
shift
n
elimina n cadenas de la lista de parámetros posicionales. Asíshift $((OPTIND-1))
elimina todas las opciones que se han analizado getopts
de la lista de parámetros y, después de ese punto, $1
se referirá al primer argumento sin opción pasado al script.
Actualizar
Como menciona mikeserv en el comentario, shift $((OPTIND-1))
puede ser inseguro. Para evitar la división de palabras no deseada, etc., todas las expansiones de parámetros deben ser entre comillas dobles. Entonces la forma segura para el comando es
shift "$((OPTIND-1))"
find
) pueden parecer que permiten opciones después de no opciones, pero no: tienen operandos que comienzan con un guión.
IFS
, pero es mejor prevenir que curar. ;)
IFS=0123456789
, shift $((OPTIND-1))
(sin comillas) se convertirá en lo shift ""
que se ignorará en silencio (en ksh
) o generará un error (en bash
y dash
).
$((...))
solo calcula cosas. En su caso, toma el valor de $optint
y resta 1.
shift
elimina los parámetros posicionales. En su caso, elimina los optint-1
parámetros.
Para obtener más información echar un vistazo a help getopts
, help shift
, ver man bash
para "expansión aritmética", y especialmente Google para getopts
.