L'échappement des caractères spéciaux dans des variables bash
Je suis en train de lire un fichier contenant filepaths ligne par ligne et de scp les fichiers sur un autre serveur, mais à cause de certains caractères dans les noms de fichiers comme '(', ')', '& " etc. J'ai besoin d'échapper à la saisie:
input.txt:
/folder1/folderA/filename+(oh+how+nice,+parantheses)
script.sh:
#!/bin/sh
promote_to=random.server.com
dev_catalog=/folderX/
uat_catalog=/folderY/
while read line
do
uat_path=$(echo "$uat_catalog$line" | sed -e "s/(/\\\(/g" | sed -e "s/)/\\\)/g")
dev_path=$(echo "$dev_catalog$line" | sed -e "s/(/\\\(/g" | sed -e "s/)/\\\)/g")
scp $dev_path user@$promote_to:$uat_path
scp $dev_path".atr" user@$promote_to:$uat_path".atr"
done < "input.txt"
Sortie:
-bash: /folder1/folderA/filename+(oh+how+nice,+parantheses): No such file or directory
-bash: /folder1/folderA/filename+(oh+how+nice,+parantheses): No such file or directory
usage: scp [-1246BCpqrv] [-c cipher] [-F ssh_config] [-i identity_file]
[-l limit] [-o ssh_option] [-P port] [-S program]
[[user@]host1:]file1 [...] [[user@]host2:]file2
ssh: random.server.com: Name or service not known
lost connection
Toute sorte d'aide est appréciée.
OriginalL'auteur Andrei Ionita | 2012-02-28
Vous devez vous connecter pour publier un commentaire.
Une partie du problème ici est que les locaux et à distance les noms de fichiers sont analysés différemment: le nom local est utilisé directement, de sorte que la seule chose que vous devez faire est de l'encadrer par des guillemets (comme dans @Ignacio de réponse), mais la télécommande nom de fichier est transmis à un shell distant qui exécute par le biais d'une autre couche de l'analyse (de devis et d'échapper à la suppression, etc). Donc, vous voulez ajouter échappe pour le chemin d'accès à distance seulement. J'ai aussi pris la liberté de simplifier la
sed
commande un peu:Noter que le
sed
modèle que j'ai utilisé,'s/[()&]/\\&/g'
, s'échappe uniquement des parenthèses et des arobases; si vos noms de fichiers contiennent toute autre shell métacaractères, assurez-vous de les ajouter à la liste des caractères de[]
.Pour ceux qui s'interrogent sur les moyens d'échapper les guillemets simples, voir ici: unix.stackexchange.com/questions/9746/...
OriginalL'auteur Gordon Davisson
Vous essayez d'exécuter
/folder1/folderA/filename+(oh+how+nice,+parantheses)
comme une commande. Vous avez probablement censé pour faireecho /folder1/folderA/filename+(oh+how+nice,+parantheses) | ...
à la place.Edit: ce que @Ignacio dit.
suppression d'une barre oblique inverse à partir de chaque sed jette ce cependant: "bash: -ligne c: 0: erreur de syntaxe près de jeton inattendu
(' bash: -c: line 0:
scp -t bash: -ligne c: 0: erreur de syntaxe près de jeton inattendu(' bash: -c: line 0:
scp -t /dossier1/folderA/filename+(oh+comment+belle,+parenthèse) "perte de connexion"OriginalL'auteur Eduardo Ivanec