2010-02-22 5 views
7

Est-il possible d'avoir plusieurs opérateurs unaires dans les instructions if? Voici l'extrait de code qui me donne une erreur.bash: Opérateurs unaires multiples dans l'instruction if

Veuillez corriger le code ici.

if [ -f $input_file ] -a [ -f $output_file ] -a [ -f $log_file ] ] 
then 
### Some Code here 
fi 

Merci Kiran

Répondre

10
if [ -f "file1" -a -f "file2" -a "file3" ]; then 
    #some code 
fi 
+0

Cela fonctionne comme un Magic .. merci pour la réponse rapide .. – Kiran

1

[ est une commande, ne fait pas partie de la déclaration if. En tant que tel, vous devez lui transmettre chacun des arguments appropriés au lieu d'essayer de l'exécuter incorrectement comme vous l'avez fait.

if [ arg1 arg2 arg3 arg4 ... ] 
then 
+0

Dans les environnements Cygwin, il existe un C: \ cygwin \ bin \\ [.exe. Un sentiment vraiment étrange de jeter un coup d'oeil à ce dossier pour la première fois. – Boldewyn

+0

Commande similaire '[' in '/ usr/bin' sur la plupart des distributions Linux, malgré le fait que' ['est généralement un bash intégré. –

4

Vous pouvez voir l'opérateur [ ... ] seulement comme un raccourci pour test .... Les options sont utilisées de la même manière.

Donc, dans votre cas, vous pouvez soit écrire le ghostdog74 manière ou:

if [ -f $input_file ] && [ -f $output_file ] && [ -f $log_file ] 
then 
### Some Code here 
fi 
5

Si vous utilisez double support de Bash, vous pouvez le faire:

if [[ -f "$input_file" && -f "$output_file" && -f "$log_file" ]] 

que je trouve plus propre lire que d'autres options montrées ici (mais c'est subjectif). Cependant, il a other advantages.

Et, comme ghostdog74 montre, vous devriez toujours citer des variables contenant des noms de fichiers.

+0

Il n'est pas nécessaire de citer des variables contenant des noms de fichiers si vous utilisez un double-crochet car BASH ne fait pas de WordSplitting avec des doubles crochets. Voir http://mywiki.wooledge.org/BashFAQ/031 – Cliff

Questions connexes