Obtenir une liste de course VMs utiliser VBoxManage
Je veux boucle dans ma course VM et de retour que ce qui est entre guillemets.
Donc cette commande:
VBoxManage list runningvms
retourne:
"UbuntuServer" {7ef01f8d-a7d5-4405-af42-94d85f999dff}
Et je ne le veux de retour:
UbuntuServer
C'est ce que j'ai à ce jour (échec):
#!/bin/bash
for machine in `cat VBoxManage list runningvms`; do
echo "$machine"
done
exit
Vous devez vous connecter pour publier un commentaire.
Avertissement: tout cela est risqué si votre VM noms shell glob personnages en eux, ou qui contiennent des espaces.
Vous pouvez faire quelque chose comme cela si il y a une seule exécution de la VM:
Alternative avec bash tableaux (même condition):
Si ce programme renvoie plus d'une ligne, une approche classique serait:
array=( $(...) )
approche, à la fois, par exemple, pour remplacer un seul jeton*
dans votre entrée avec une liste de fichiers dans le répertoire courant. Voir Ne pas Lire les Lignes Avec Pour, BashPitfalls #50 et BashFAQ #1*
dans la mémoire tampon utilisée pour un nom... et un script shell itération sur les noms de fichiers à l'âge de la sauvegarde système, puis supprimé tout).while read ... do
syntaxe est exactement ce que je cherchais!cut
par écritwhile IFS='"' read _ machine _; do
.pour one-liner fans:
Pour valider chaque ligne que vous avez bien lu, la manière la plus sûre à faire est d'écrire une expression régulière et l'utilisation
BASH_REMATCH
pour extraire correspondent à des groupes d'elle.Avec le code suivant:
...et les suivantes se moquer de mise en œuvre de VBoxManage (pour permettre à des gens sans VirtualBox pour reproduire le test):
...la sortie est comme suit:
Remarque avantages de cette approche:
*
de ne pas avoir le nom silencieusement remplacé par le nom d'un fichier dans le répertoire courant).sed
,cut
, &c., mais repose uniquement sur shell builtin fonctionnalités -- voir BashFAQ #1 documenter l'utilisation dewhile read
, et le bash-pirates wiki sur des expressions rationnelles documenter[[ $string =~ $re ]]
.À boucle à travers:
Cela cassera si votre machine dispose d'espaces dans son nom.