web-dev-qa-db-fra.com

Expliquez la commande Shell: shift $ (($ optind - 1))

Je ne suis pas un gars Linux mais coincé dans un script que je dois lire pour mon projet. Alors, quelqu'un peut-il m'aider sur ce que fait cette commande?

shift $(($optind - 1))
35
Gaurav Pant

shift $((OPTIND-1)) (note OPTIND est en majuscule) se trouve normalement immédiatement après une boucle getoptswhile$OPTIND Est le nombre d'options trouvées par getopts.

Comme pauljohn32 le mentionne dans les commentaires à proprement parler, OPTIND donne la position de l'argument de ligne de commande next.

Depuis le GNU Manuel de référence Bash :

getopts optstring nom [arguments]

getopts est utilisé par les scripts Shell pour analyser les paramètres positionnels. optstring contient les caractères d'option à reconnaître; si un caractère est suivi de deux points, l'option devrait avoir un argument, qui devrait être séparé de celui-ci par des espaces. Les deux points (":") et le point d'interrogation ("?") Ne peuvent pas être utilisés comme caractères d'option. Chaque fois qu'elle est invoquée, getopts place l'option suivante dans le nom de la variable Shell, initialisant name si elle n'existe pas, et l'index de l'argument suivant à traiter dans la variable OPTIND. OPTIND est initialisé à 1 à chaque appel du shell ou d'un script shell. Lorsqu'une option nécessite un argument, getopts place cet argument dans la variable OPTARG. Le shell ne réinitialise pas OPTIND automatiquement; il doit être réinitialisé manuellement entre plusieurs appels à getopts dans le même appel Shell si un nouvel ensemble de paramètres doit être utilisé.

Lorsque la fin des options est rencontrée, getopts se ferme avec une valeur de retour supérieure à zéro. OPTIND est défini sur l'index du premier argument sans option, et le nom est défini sur "?".

getopts analyse normalement les paramètres de position, mais si plus d'arguments sont donnés dans args, getopts les analyse à la place.

shift n
supprime n chaînes de la liste des paramètres de position. Ainsi, shift $((OPTIND-1)) supprime toutes les options qui ont été analysées par getopts de la liste des paramètres, et donc après ce point, $1 Fera référence au premier argument de non-option passé au script.

Mise à jour

Comme le mentionne mikeserv dans le commentaire, shift $((OPTIND-1)) peut être dangereux. Pour éviter le fractionnement de mots indésirable, etc., toutes les extensions de paramètres doivent être entre guillemets. Donc, la forme sûre de la commande est

shift "$((OPTIND-1))"

56
PM 2Ring

$((...)) calcule simplement les choses. Dans votre cas, il prend la valeur de $optint et résumés 1.

shift supprime les paramètres de position. Dans votre cas, il supprime optint-1 paramètres.

Pour plus d'informations, consultez help getopts, help shift, Regarder man bash pour "Arithmetic Expansion", et surtout google pour getopts .

8
michas