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 OPTINDes mayúscula) normalmente se encuentra inmediatamente después de un getopts whilebucle. $OPTINDes la cantidad de opciones encontradas por getopts.
Como pauljohn32 menciona en los comentarios, estrictamente hablando, OPTINDda la posición del siguiente argumento de línea de comando.
Del Manual de referencia de GNU Bash :
getopts optstring name [args]
getoptses utilizado por los scripts de shell para analizar parámetros posicionales.optstringcontiene 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,getoptscoloca la siguiente opción en el nombre de la variable de shell, inicializandonamesi no existe, y el índice del siguiente argumento que se procesará en la variableOPTIND.OPTINDse 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 reiniciaOPTINDautomáticamente; debe reiniciarse manualmente entre varias llamadasgetoptsdentro 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,
getoptssale con un valor de retorno mayor que cero.OPTINDse establece en el índice del primer argumento sin opción y el nombre se establece en '?'.
getoptsnormalmente analiza los parámetros posicionales, pero si se dan más argumentosargs,getoptsanaliza 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 getoptsde la lista de parámetros y, después de ese punto, $1se 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 bashy dash).
$((...))solo calcula cosas. En su caso, toma el valor de $optinty resta 1.
shiftelimina los parámetros posicionales. En su caso, elimina los optint-1parámetros.
Para obtener más información echar un vistazo a help getopts, help shift, ver man bashpara "expansión aritmética", y especialmente Google para getopts.