erreur de script unix

J’ai la ligne suivante dans mon fichier script unix:

if [[ -f $DIR1/$FILE1 ] -a [ -f $DIR1/$FILE2 ]]; then 

Comme la ligne vérifie l’existence de deux fichiers dans un répertoire et si les deux fichiers sont présents, une logique sera exécutée.

Cependant, lors de l’exécution du script, j’obtiens l’erreur suivante sur la ligne ci-dessus:

 test_script: line 30: syntax error at line 54: `]' unexpected 

la ligne 54 est où la ligne ci-dessus est présente.

Que signifie cette erreur ? Où est-ce que je me trompe?

Merci d’avoir lu!

Pour les shells les plus communs au moins, [] ne sont pas comme des parenthèses dans C où vous utilisez ensuite pour regrouper des sous-expressions.

Ce dont vous avez besoin est quelque chose comme (pour bash ):

 if [[ -f $DIR1/$FILE1 && -f $DIR1/$FILE2 ]]; then 

Si vous voulez de l’aide avec un shell spécifique (autre que bash ), vous devez nous indiquer celui que vous utilisez.

Il n’y a pas besoin de [] avec -f.

 if [ -f $DIR1/$FILE1 -a -f $DIR1/$FILE2 ]; then 

Sortie:

 shadyabhi@archlinux /tmp $ touch foo;touch foo2 shadyabhi@archlinux /tmp $ if [ -f "foo" -a -f "foo2" ]; then echo "Hello"; fi Hello shadyabhi@archlinux /tmp $ 

Il est intéressant de noter qu’il existe de nombreuses réponses expliquant les différences subtiles entre [et [[, mais pour une raison quelconque, notre culture semble décourager les gens de fournir la solution évidente. Arrêtez d’utiliser ‘[‘ entièrement. Au lieu de “[“, utilisez le test:

 if test -f $ DIR1 / $ FILE1 && test -f $ DIR1 / $ FILE2;  puis

Test est une syntaxe plus propre que «[‘, ce qui nécessite un argument final’]» et confond continuellement les gens en leur faisant croire que les crochets font partie du langage. ‘[[‘ n’est pas portable et confond les personnes qui ne réalisent pas que de nombreux shells fournissent des fonctionnalités supplémentaires non standard. Il y a un cas à faire que [[peut être plus efficace que [, mais si les performances au moment de l’exécution sont un problème dans votre shell, vous ne devriez probablement pas résoudre le problème dans sh.

Vous aviez plus [ et ]

 if [ -f $DIR1/$FILE1 -a -f $DIR1/$FILE2 ]; then 

Fondamentalement, vous mixiez deux syntaxes visant à faire la même chose: à savoir [ ] et [[ ]] . Le premier est plus portable mais le second est plus puissant; bien que la majorité des obus que vous rencontreriez soient compatibles [[ ]] .

Mais mieux encore est le suivant puisque vous utilisez déjà la construction [[ ]]

 if [[ -f $DIR1/$FILE1 && -f $DIR1/$FILE2 ]]; then 

Comme @paxdiablo l’a déclaré, vous pouvez l’utiliser de cette façon:

 if -f $DIR1/$FILE1 && -f $DIR1/$FILE2 ; then 

ou vous pouvez l’utiliser de cette façon:

 if -f $DIR1/$FILE || -f $DIR1/$FILE2 ;