basename avec des espaces dans un script bash?
Je travaille sur un script bash pour créer un nouveau dossier dans /tmp/utilisant le nom d'un fichier, puis copiez le fichier dans le dossier.
#!/bin/bash
MYBASENAME="`basename $1`"
mkdir "/tmp/$MYBASENAME"
for ARG in "$@"
do
mv "$ARG" "/tmp/$MYBASENAME"
done
Comportement:
Quand je tape dans mymove "/home/me/downloads/my new file.zip"
il montre ceci:
mkdir /tmp/my
new
file.zip
mv: rename /home/me/downloads/my new file.zip to /tmp/my\nnew\nfile.zip:
J'ai beaucoup de guillemets autour de tout, donc je ne comprends pas pourquoi cela ne fonctionne pas comme prévu.
Aussi, j'ai la forme de boucle, au cas où il y a plusieurs fichiers. Je les veux toutes pour être copié dans le même dossier, basé sur le premier argument est basename.
source d'informationauteur cwd
Vous devez vous connecter pour publier un commentaire.
Dans le cas où la cession est une simple substitution de commande vous n'avez pas besoin de citer la substitution de commande. Le shell ne pas effectuer de couper un mot pour les affectations de variables.
est tout ce qu'il faut. Vous devriez prendre l'habitude d'utiliser
$()
au lieu de backticks parce que$()
nids plus facilement (c'est POSIX, btw., et tous les coquillages en charge.)PS: Vous devriez essayer de pas écrire bash scripts. Essayez d'écrire shell scripts. La différence étant l'absence de bashisms, zshisms, etc. Tout comme pour C, la portabilité est une fonction de votre choix de scripts, surtout si il peut être atteint facilement. Votre script n'utilise pas de bashisms, alors j'aimerais écrire
#!/bin/sh
à la place. Pour la nit de sélecteurs: Oui, je sais, le vieux SunOS et Solaris/bin/sh
ne comprends pas$()
mais la/usr/xpg4/bin/sh
est un shell POSIX.Le problème est que
$1
dansn'est pas cité. Utilisez ceci à la place:
Il vous manque un ensemble de citations!
Qui va résoudre votre problème.
devrait être
Envelopper le
$1
avec des guillemets doubles"$1"