2010-01-15 4 views
1
#!/bin/bash -x 

echo "Enter file name: " 
read fileName 
fileName=`pwd`"/$fileName" 
if [ -f $fileName ]; then 
    echo "file is present" 
fi 

Même si je change la valeur de fileName en ajoutant des guillemets au début et à la fin .. Le script ne fonctionne toujours pas.Comment faire fonctionner ce script bash si la variable "fileName" contient de l'espace?

+1

Utilisez: 'fileName = $ (pwd) /" $ fileName "' ou même 'fileName =" $ PWD/$ nomFichier "'; alors vous avez juste besoin de vous soucier de l'utilisateur en tapant/dev/null plutôt que d'un nom par rapport au répertoire en cours (peut-être aussi, l'utilisateur tapant ../../../../../../etc/passwd). Dernier point: les middleCapitals ont l'air vraiment bizarre dans un script shell. –

+0

ya .. mieux vaut utiliser la variable d'environnement. :) –

Répondre

4

il emballage dans des guillemets doubles fonctionne pour moi:

#!/bin/bash -x 

echo "Enter file name: " 
read fileName 
fileName=`pwd`"/$fileName" 
if [ -f "$fileName" ]; then 
     echo "file is present" 
fi 

Je crois que cela prendra soin de la plupart des caractères spéciaux, y compris les citations elles-mêmes.

+0

Pourquoi la downvote? –

+0

: omg: c'était facile ... merci. –

1

nom de fichier Surround avec des citations:

if [ -f "$fileName" ]; then 
5

Vous devez utiliser les guillemets dans le if ainsi:

if [ -f "$fileName" ]; then 
2

Vous pouvez citer le nom de fichier lorsque vous faites le test -f. Essayez plutôt

#!/bin/bash -x 
echo "Enter file name: " 
read fileName 
fileName=`pwd`/$fileName 
if [ -f "$fileName" ]; then 
    echo "file is present" 
fi 
3

changement if [ -f $fileName ]; then à if -f "$fileName" ];. Sinon, lorsque le fichier contient un espace, l'opération -f recevra plus d'un argument. Si vous avez passé un fichier nommé "this file", le shell l'étendra à:

if [ -f this file ]; then 

provoquant l'erreur.

2

Vous ajoutez le mot de passe à la ligne même si l'utilisateur a entré un chemin absolu. Essayez ceci:

case "$fileName" in 
    /*) ;; # okay 
    *) fileName=`pwd`/"$fileName" 
esac 

Cela ne fera que préfixer le pwd si fileName ne commence pas par un /.

En outre, votre test if ne réussira que si fileName est un fichier normal. Si vous voulez qu'il réussisse pour les répertoires et autres, testez avec -e au lieu de -f.

+0

+1 pour répondre à la question suivante qui pourrait être posée. –

Questions connexes