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))
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))
Réponses:
shift $((OPTIND-1))
(la note OPTIND
est en majuscule) se trouve normalement immédiatement après une getopts
while
boucle. $OPTIND
est le nombre d'options trouvées par getopts
.
Comme le mentionne pauljohn32 dans les commentaires, à proprement parler, OPTIND
donne la position du prochain argument de ligne de commande.
Dans le manuel de référence GNU Bash :
getopts optstring name [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, initialisantname
si elle n'existe pas, et l'index de l'argument suivant à traiter dans la variableOPTIND
.OPTIND
est initialisé à 1 chaque fois que le shell ou un script shell est appelé. Lorsqu'une option nécessite un argument, getopts place cet argument dans la variableOPTARG
. Le shell ne se réinitialise pasOPTIND
automatiquement; il doit être réinitialisé manuellement entre plusieurs appelsgetopts
dans le même appel de shell si un nouvel ensemble de paramètres doit être utilisé.Lorsque la fin des options est rencontrée,
getopts
quitte 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 fournisargs
, lesgetopts
analyse à la place.
shift
n
supprime n chaînes de la liste des paramètres de position. shift $((OPTIND-1))
Supprime ainsi toutes les options qui ont été analysées par getopts
de la liste des paramètres, et donc après ce point, $1
se référera au premier argument de non-option passé au script.
Mise à jour
Comme le mentionne mikeserv dans le commentaire, cela shift $((OPTIND-1))
peut être dangereux. Pour éviter le fractionnement de mots indésirables, etc., toutes les extensions de paramètres doivent être entre guillemets doubles. Donc, la forme sûre de la commande est
shift "$((OPTIND-1))"
find
) peuvent sembler autoriser les options après les non-options, mais ils ne le font pas: ils ont des opérandes qui commencent par un tiret.
IFS
, mais il vaut mieux prévenir que guérir. ;)
IFS=0123456789
, shift $((OPTIND-1))
(sans guillemets) se transformera en shift ""
lequel sera silencieusement ignoré (in ksh
) ou générera une erreur (in bash
and dash
).
$((...))
calcule juste des trucs. Dans votre cas, il prend la valeur de $optint
et soustrait 1.
shift
supprime les paramètres de position. Dans votre cas, il supprime les optint-1
paramètres.
Pour plus d' informations consulter help getopts
, help shift
, regardez man bash
pour « Arithmétique », et en particulier Google pour getopts
.