2017-10-17 4 views
0

J'essaie de vérifier si plusieurs fichiers existent dans le script shell, mais je ne suis pas sûr comment cela fonctionne.Comment utiliser une déclaration de décision multiple dans un shell?

J'ai essayé

#!/bin/bash 
path=/home/test 
     cd $path 
     if [ -f "a.txt"] || [ -f "b.txt" ] || [ -f "c.txt" ] || [-f "d.txt"] 
     then 
       echo "one of the file exist" 
     else 
       echo "non of the file exist" 
     fi 

Je reçois

line 4: [: missing ']' 

J'ai vu des gens utilise des crochets doubles, mais qui ne fonctionne que si elle est pour bash pas

Posix
+1

put **; ** à la fin du if et laisser un espace blanc entre ** [..] ** – Frank

+0

[-f "d.txt"]; J'ai changé pour ceci mais je reçois toujours line4: [: missing ']' – logger

+2

ceci est aussi faux ** [-f "a.txt"] ** – Frank

Répondre

2

Ceci est vraiment plus évident si vous arrêtez d'essayer d'utiliser l'orthographe [. Il suffit d'écrire:

if test -f "a.txt" || test -f "b.txt" || test -f "c.txt" || test -f "d.txt"; then ... 

ou (. C'est l'utilisation obsolète, et ne doit pas être utilisé Merci à @chepner pour avoir signalé), vous pouvez le faire:

if test -f a.txt -o -f b.txt -o -f c.txt -o -f d.txt; then ... 

Aussi, si vous êtes prêt à faire confiance aux caprices de votre shell (ce qui veut dire que même si la norme spécifie que set -f va provoquer le shell pour désactiver l'expansion du chemin, je ne ferais pas confiance à chaque shell pour se comporter comme prévu), vous pouvez faire:

set +f; if ! test [abcd].txt = '[abcd].txt' 2> /dev/null; then ... 
+0

serait-il acceptable si j'utilise des caractères génériques dans le paramètre de fichier comme -f * .txt à la place? Je me demandais si la syntaxe serait la même que les guillemets pour le caractère générique m'inquiète – logger

+0

Non. Supposons que a.txt et c.txt existent tous les deux. Dans ce cas, dans des conditions normales (par exemple, cela dépend de certains paramètres dans le shell) 'test -f * .txt' est identique à l'écriture de' test -f a.txt c.txt', ce qui générera une erreur. Si aucune n'existe, 'test -f * .txt' testera l'existence d'un fichier nommé' * .txt' –

+0

J'ai l'erreur "test de commande non trouvé" si je supprime les parenthèses – logger

1

Vous devez taper un espace entre le guillemet et le crochet de fermeture ainsi qu'entre le crochet d'ouverture et le paramètre. La bonne syntaxe est:

if [ -f "a.txt" ] || [ -f "b.txt" ] || [ -f "c.txt" ] || [ -f "d.txt" ] 

Non

if [ -f "a.txt"] || [ -f "b.txt" ] || [ -f "c.txt" ] || [-f "d.txt"] 
1

Le problème est que dans [ -f "a.txt"] le support carré de fermeture est considérée comme faisant partie de la chaîne, à savoir [ -f "a.txt]", vous devez donc ajouter un espace avant le crochet de fermeture: [ -f "a.txt" ].

Même avec les supports d'ouverture. Le [-f "d.txt"] sera analysé comme "[-f" "d.txt]", de sorte que vous devez ajouter de l'espace après l'ouverture et avant la parenthèse fermante ici: [ -f "d.txt" ].