Je veux écrire un script qui boucle sur 15 chaînes (tableau éventuellement?) Est-ce possible?
Quelque chose comme:
for databaseName in listOfNames
then
# Do something
end
Vous pouvez l'utiliser comme ceci:
## declare an array variable
declare -a arr=("element1" "element2" "element3")
## now loop through the above array
for i in "${arr[@]}"
do
echo "$i"
# or do whatever with individual element of the array
done
# You can access them using echo "${arr[0]}", "${arr[1]}" also
Fonctionne également pour la déclaration de tableau multiligne
declare -a arr=("element1"
"element2" "element3"
"element4"
)
C'est possible, bien sûr.
for databaseName in a b c d e f; do
# do something like: echo $databaseName
done
Voir Boucles Bash pour, pendant et jusqu'à pour plus de détails.
for year in $(seq 2000 2013)
.DATABASES="a b c d e f"
.Aucune de ces réponses ne comprend un compteur ...
Production:
la source
echo "$i / ${arraylength} : ${array[$i-1]}"
- sinon, si votre$i
contient un glob, il sera développé, s'il contient un onglet, il sera changé en un espace, etc.Oui
Production:
Pour préserver les espaces; entrées de liste de devis simples ou doubles et extensions de liste de devis doubles.
Production:
Pour créer une liste sur plusieurs lignes
Production:
Variable de liste simple
ou
Affichez la variable de liste:
Production:
Parcourez la liste:
Production:
Créez une fonction pour parcourir une liste:
Utiliser le mot clé declare (commande) pour créer la liste, qui est techniquement appelée un tableau:
Production:
Création d'un tableau associatif. Un dictionnaire:
Production:
Variables ou fichiers CVS dans une liste .
Changer le séparateur de champ interne d'un espace à ce que vous voulez.
Dans l'exemple ci-dessous, il est remplacé par une virgule
Production:
Si besoin de les numéroter:
cela s'appelle une tique arrière. Mettez la commande à l'intérieur des tiques arrière.
Il se trouve à côté du numéro un de votre clavier et ou au-dessus de la touche de tabulation. Sur un clavier standard anglais américain.
La sortie est:
Se familiariser avec le comportement des bashes:
Créer une liste dans un fichier
Lire le fichier de liste dans une liste et afficher
Manuel de référence de la ligne de commande BASH: signification spéciale de certains caractères ou mots pour le shell.
la source
"${List[@]}"
être correct, avec les guillemets .${List[@]}
est faux.${List[*]}
est faux. EssayezList=( "* first item *" "* second item *" )
- vous obtiendrez un comportement correct pourfor item in "${List[@]}"; do echo "$item"; done
, mais pas à partir d'une autre variante.List=( "first item" "second item" )
sera divisé enfirst
,item
,second
,item
et).ls
sortie, en violation des meilleures pratiques .Dans le même esprit que la réponse de 4ndrew:
B. Aucun espace dans les noms:
Remarques
listOfNames="RA RB R C RD"
a la même sortie.D'autres moyens de saisir des données incluent:
Lire depuis stdin
IFS='\n'
, ou pour MacOSIFS='\r'
)#!/bin/bash
en haut du fichier de script indique l'environnement d'exécution.Autres sources ( en boucle de lecture )
la source
IFS
. (Pour tout le monde,IFS
permet de spécifier un délimiteur spécifique, ce qui permet aux autres espaces blancs d'être inclus dans les chaînes sans être séparés en sous-chaînes).$databaseName
contient juste la liste entière, donc ne fait qu'une seule itération.Vous pouvez utiliser la syntaxe de
${arrayName[@]}
la source
Surpris que personne n'ait encore posté cela - si vous avez besoin des index des éléments pendant que vous parcourez le tableau, vous pouvez le faire:
Production:
Je trouve cela beaucoup plus élégant que le style de boucle "traditionnel" (
for (( i=0; i<${#arr[@]}; i++ ))
).(
${!arr[@]}
et$i
n'ont pas besoin d'être cités car ce ne sont que des chiffres; certains suggèrent de toute façon de les citer, mais ce n'est qu'une préférence personnelle.)la source
Ceci est également facile à lire:
la source
IFS=$'\n'
cela peut également fonctionner pour d'autres solutions dans ce scénario.Tableau implicite pour le script ou les fonctions:
En plus de la bonne réponse de anubhava : Si la syntaxe de base pour la boucle est:
Il y a un cas particulierfrapper:
Lors de l' exécution d' un script ou une fonction, les arguments transmis à des lignes de commande seront affectés à la
$@
variable de tableau, vous pouvez accéder par$1
,$2
,$3
et ainsi de suite.Cela peut être rempli (pour test) par
Une boucle sur ce tableau pourrait s'écrire simplement:
Notez que le travail réservé
in
n'est pas présent et pas de nom de tableau aussi!Échantillon:
Notez que c'est la même chose que
Puis dans un script :
Enregistrer dans un script
myscript.sh
,chmod +x myscript.sh
puisIdem dans une fonction :
alors
la source
ou juste
la source
Manière simple:
la source
Le tableau declare ne fonctionne pas pour le shell Korn. Utilisez l'exemple ci-dessous pour le shell Korn:
la source
for i in ${foo[*]}
est fondamentalement toujours la mauvaise chose -for i in "${foo[@]}"
c'est la forme qui préserve les limites de la liste d'origine et empêche l'expansion des globes. Et l'écho doit êtreecho "$i"
Ceci est similaire à la réponse de user2533809, mais chaque fichier sera exécuté comme une commande distincte.
la source
Si vous utilisez le shell Korn, il y a " set -A databaseName ", sinon il y a " declare -a databaseName "
Pour écrire un script fonctionnant sur tous les shells,
Il devrait fonctionner sur tous les obus.
la source
$ bash --version
GNU bash, version 4.3.33 (0) -release (amd64-portbld-freebsd10.0)$ set -A databaseName=("db1" "db2" ....) || declare -a databaseName=("db1" "db2" ....)
bash: erreur de syntaxe près du jeton inattendu `('Essaye ça. Il fonctionne et a été testé.
la source
array=( "hello world" )
, ouarrray=( "*" )
; dans le premier cas, il imprimerahello
etworld
séparément, dans le second, il imprimera une liste de fichiers au lieu de*
Première ligne possible de chaque script / session Bash:
Utilisez par exemple:
Peut considérer:
echo
interprète-e
comme option icila source
Bouclage sur une seule ligne,
vous obtiendrez une sortie comme celle-ci,
la source
Ce dont j'avais vraiment besoin, c'était quelque chose comme ça:
Par exemple:
(Tuerait tous les processus avec vlc en leur nom)
la source
Je passe en revue un tableau de mes projets pour une
git pull
mise à jour:la source