2011-02-10 3 views
3

Espérons que cela devrait être simple ... Voici mon fichier test.sh:Comment gérer des espaces dans une variable dans un script shell bash?

#!/bin/bash 
patch_file="/home/my dir/vtk.patch" 
cmd="svn up \"$patch_file\"" 
$cmd 

Notez l'espace dans « mon répertoire ». Quand je l'exécute,

$ ./test.sh 
Skipped '"/home/my' 
Skipped 'dir/vtk.patch"' 

Je n'ai aucune idée de la façon d'adapter l'espace dans la variable et d'exécuter la commande. Mais l'exécution de ce qui suit sur le shell bash fonctionne sans problème.

$ svn up "/home/my dir/vtk.patch" #WORKS!!! 

Toutes les suggestions seront grandement appréciées! J'utilise le bash de cygwin sur Windows.

+0

Pourquoi voulez-vous placer la commande dans une variable? Pourquoi ne pas simplement exécuter la commande directement? –

+0

@Dennis - Le répertoire personnel du fichier patch est détecté lors de l'exécution. Un autre script détecte le répertoire personnel comme "/ home/mon dir /" et le passe comme argument à ce script. Ce script ajoute "vtk.patch" au répertoire home détecté et fait un svn up sur le fichier patch. – Bala

+0

Veuillez voir ["J'essaie de placer une commande dans une variable, mais les cas complexes échouent toujours!"] (Http://mywiki.wooledge.org/BashFAQ/050 "BashFAQ/050"). –

Répondre

4

Utiliser eval $ cmd, au lieu de plain $ cmd

+1

Évalué $ cmd fonctionne! Merci beaucoup ... – Bala

+2

@Bala: Soyez conscient des [risques de sécurité de 'eval'] (http://mywiki.wooledge.org/BashFAQ/048" BashFAQ/048 "). –

2

Avez-vous essayé d'échapper à cet espace?
En règle générale, les shells UNIX n'aiment pas les caractères non standard dans les noms de fichiers ou de dossiers. La manière normale de gérer ceci est d'échapper au personnage offensant. Essayez:

patch_file="/home/my\ dir/vtk.patch" 

Notez l'antislash.

+1

Oui, je l'ai essayé. Sorties, ignoré '"/ home/my \' " Dir/vtk.patch "' – Bala

Questions connexes