Le code de l'échantillon ci-dessous montre que les arguments / arguments peuvent être facilement inspectés avec une commande imprimée à une ligne, alors qu'un tableau créé à partir des arguments ne peut pas être inspecté avec la même commande. Et il nous rappelle que l'approche "variable" perd la distinction entre les arguments individuels, si un argument est contenant des espaces.
est là un moyen de copier le tableau d'un script vers un nouvel objet qui peut être examiné avec celui-ci qui peut être examiné avec celui-ci. -Le commande printf -line? P>
est la liste d'arguments d'un script identique dans sa structure et son comportement à n'importe quel objet (analogue à un tableau, une variable, etc.) que l'on peut créer dans un script Bash? p>
3 Réponses :
est la liste d'arguments d'un script identique dans sa structure et son comportement à n'importe quel objet (analogue à une matrice, une variable, etc.) que l'on peut créer dans un script Bash? P>
Oui, et non. Il y a des similitudes, principalement à un tableau. Essayons de créer une liste et de comparer des arguments avec un tableau
Ar code>: p>
- Obtenez l'argument Count:
$ # code> vs
$ {# arr [@]} code> li>
- accès ex. 3ème argument / élément:
3 $ code> vs
$ {arr [3]} code> li>
- Access N-ème argument / élément:
$ {@: $ N: 1} code> vs
$ {arrated]} code>. Mais la tranchée de tableau fonctionnera également sur les tableaux:
$ {arr [@]: $ n: 1} code>. Li>.
- SET NTH ARGUMENT: BUH, vous devriez faire
Set - $ {@: 1: $ (((N-1))} NEWVALUE $ {@: $ ((n + 1))} < / code> vs
arr [$ n] = newvalue code> li>
- Changement de droite:
shift code> ou, eh bien,
set - "$ {@: 2}" code> vs
arr = ("$ {arr [{arr [@ @ @] : 1} ") code> li>
- argument est toujours continu
0 $ code>
1 $ code>
2 $ code>, pendant que vous pouvez
arr = (); arr [10] = valeur; arr [100] = valeur code>. li>
- Obtenir des index: quelque chose le long
$ (SEQ $ #) code> vs
$ {! arr [@]} code> li> li> li>
- est correctement échappé:
"$ @" code> vs
"$ {arr [@]}" code> li>
- Obtenez en tant que chaîne unique:
"$ *" code> vs
"$ {arr [*]}" code> li> li> ul>
résumer: p>
- Arguments dans les scripts doivent être consultés à l'aide de
$ @ code> et
$
code>. li> - Vous pouvez utiliser sur
$ @ code> beaucoup comme sur les tableaux, mais vous ne pouvez pas facilement assigner et / ou supprimer des éléments. LI>
- Il y a aussi la commande spéciale
shift code>, qui déplace les arguments. LI>
- les "paramètres spéciaux"
$ @ code>
$ * code>
$ # # code> et
$ code> code> < href = "https://pubs.opengroup.org/onlinepubs/007904875/utilities/shift.html" rel = "nofollow noreferrer">
shift code> et
SET code>
Les commandes sont spécifiées par POSIX Shell . Les tableaux Bash sont disponibles uniquement sur Bash. Li> ul>à votre script: p>
argvariaable = "$ @" code> développe
$ @ code> et le rejoint en utilisant
ifs code>. Donc, vous terminerez avec une seule chaîne. Ceci est égal à
argvariable = "$ *" code>. Donc, l'échappement des arguments est perdue. Li>
comteargs = "0" pour x dans "$ {@}" fais comtéargs = $ (printf '% s \ n' "1 + $ comteargs" | BC) printf '% s \ n' "$ comteargs: '$ x'" fait code> Ceci peut être simplement simplifié pour compter l'ex. NeufLines à partir de
impression% .0s code> Sortie:
comteargs = $ (printf "% .0s \ n" "$ @" | wc -l) code>. Sinon, vous pouvez utiliser une fonction d'aide simple:
cntarg () {echo "$ #"; }; Countrgs = $ (CNTARG "$ @") code>. Faire
$ (printf '% s \ n' "1 + $ comteargs" | BC) code> est un overkill-supports de coquille
expr code> commande et bash prend en charge l'expansion arithmétique
$ ((...)) code>. Vous pouvez simplement
comteargs = $ ((((((comteargs + 1)) même> ou même
(((comteargs ++)) code> pour incrémenter une variable. LI>
"$ {argvariable [@]}" code> -
argvariable code> n'est pas un tableau. Faire
"$ {argvariable [@]}" code> est égal à
"$ argvariable" code>. Li>. ul>
Y a-t-il un moyen de copier le tableau d'argument d'un script vers un nouvel objet qui peut être examiné avec cette commande de printf d'une ligne? p> blockQquote>
enregistrer la liste sur un tableau, comme vous le faites dans
déclarer -a argarray = code> commande. p>
xxx pré> Vous pouvez alors Accès et exploiter sur
argarray code> beaucoup comme sur
$ @ code>. p> blockQuote>
Correction: Les matrices Bash sont indexées de zéro (au moins par défaut), le troisième élément sera donc $ {arr [2]} code> et le
n code> -th sera < code> $ {arr [n-1]} code>. En outre, il existe un moyen plus simple d'obtenir le
N code> -th -Th argument:
$ {! N} code>.
Réponse à "Il y a un moyen de copier l'article d'un script à un nouvel objet qui peut être examiné avec cette commande d'impression à une ligne?":
après p> Le code p> produit exactement la même sortie que p> concernant "est le Liste d'arguments d'un script identique dans sa structure et son comportement à n'importe quel objet (analogue à une matrice, une variable, etc.) que l'on peut créer dans un script Bash? ", L'objet" l'objet "le plus proche de la liste des arguments ( Paramètres de position em>) est le tableau. Les tableaux sont considérablement plus puissants cependant. Par exemple, des éléments de tableau peuvent être ajoutés, définis ou supprimés individuellement; et les tableaux peuvent être clairsemés. Voir Paramètres de positionnement (Manuel de référence Bash) et < href = "https://www.gnu.org/software/bash/manual/bash.html#aire" rel = "NOFollow NOREFERRER"> Arrays (Manuel de référence Bash) . P> Notez qu'une liste comptée d'éléments de tableau peut être imprimée avec: p>
La réponse à
Y a-t-il un moyen de copier le tableau d'argument d'un script vers un nouvel objet qui peut être examiné avec cette commande de printf d'une ligne? p> blockQuote>
est sans équivoque "oui. Utilisez un tableau, mais faites-le correctement." La lacune la plus importante de mon code d'échantillon était la suivante P>
xxx pré> qui est maintenant corrigée ci-dessous. Ainsi, il est logique de créer régulièrement
argarray code> au début d'un script. Ensuite, les arguments eux-mêmes sont préservés pour une référence ultérieure. p>
Notez qu'avec un tableau, un moyen supplémentaire d'inspecter les éléments,
non forts> disponibles avec les arguments eux-mêmes, est déclarer -p argarray code>. p>
Les plus petites lacunes, maintenant corrigées grâce aux réponses, étaient p>
- la méthode "Overkill" d'incrémentation de comtétargs li>
- mon terme imprécis "variable" lorsque "chaîne" aurait été plus claire li>
- Ne pas préciser que je voulais non seulement connaître le nombre total d'arguments, mais pour afficher leurs indices numériques. LI> ol>
i Gardez le traitement "String" en bas de ce code d'échantillon, comme un rappel que le tournant les arguments en une chaîne est une mauvaise idée. P>
> bash-example.sh arguments, printf:The dog ate the "mouse" arguments, printf:but arguments, printf:the arguments, printf:cat? /Users/BNW/u/kh/bin/bash-example.sh: line 11: declare: @: not found arguments indexed, loop: 1: 'The dog ate the "mouse" ' 2: 'but' 3: 'the' 4: 'cat?' argarray, printf:The dog ate the "mouse" argarray, printf:but argarray, printf:the argarray, printf:cat? declare -a argarray='([0]="The dog ate the \"mouse\" " [1]="but" [2]="the" [3]="cat?")' argarray indexed, loop: 1: 'The dog ate the "mouse" ' 2: 'but' 3: 'the' 4: 'cat?' argstring, printf:The dog ate the "mouse" but the cat? declare -- argstring="The dog ate the \"mouse\" but the cat?" argstring indexed, curly brackets, loop: 1: 'The dog ate the "mouse" but the cat?' argstring indexed, not bracketed, loop: 1: 'The' 2: 'dog' 3: 'ate' 4: 'the' 5: '"mouse"' 6: 'but' 7: 'the' 8: 'cat?'
Pourquoi pas seulement
comteargs = $ # code>? Ou même comme
comteargs = $ (printf "% .0s." "$ @" | Wc -c) code>? Appelant
printf "% s" 1 + 1 | BC CODE> est comme Overkill, même de l'expansion arithmétique Bash
(((comteargs ++)) code> serait suffisant.
Dès que vous convertissez la matrice en une chaîne, vous perdez la structure et je ne pense pas qu'il y ait un moyen de le récupérer.
Il suffit de le garder dans un tableau.
Les tableaux existent précisément parce que i>
argvariable = "$ @" code> ne parvient pas à préserver la distinction entre les espaces de séparateur de mots.