Mots - clés comme if, then, else, fi, for, caseet ainsi de suite doivent être dans un endroit où le shell attend un nom de commande. Sinon, ils sont traités comme des mots ordinaires. Par exemple,
echo if
imprime simplement if, il ne démarre pas une instruction conditionnelle.
Ainsi, dans la ligne
if [ -r "$NAME" -af "$NAME" ] then
le mot thenest un argument de la commande [(dont il se plaindrait s'il venait à s'exécuter). Le shell continue de chercher le thenet trouve une fiposition de commande. Puisqu'il y en ifa toujours un qui le recherche then, fic'est inattendu, il y a une erreur de syntaxe.
Vous devez mettre un terminateur de commande avant thenafin qu'il soit reconnu comme mot-clé. Le terminateur de commande le plus courant est un saut de ligne, mais avant then, il est courant d'utiliser un point-virgule (qui a exactement la même signification qu'un saut de ligne).
if [ -r "$NAME" -af "$NAME" ]; then
ou
if [ -r "$NAME" -af "$NAME" ]
then
Une fois que vous aurez corrigé cela, vous obtiendrez une autre erreur de la commande [car elle ne comprend pas -af. Vous vouliez probablement dire
if [ -r "$NAME" -a -f "$NAME" ]; then
Bien que les commandes de test ressemblent à des options, vous ne pouvez pas les regrouper comme ceci. Ce sont des opérateurs de la [commande et ils doivent chacun être un mot distinct (comme le font [et ]).
Soit dit en passant, bien que cela [ -r "$NAME" -a -f "$NAME" ]fonctionne, je recommande d'écrire soit
[ -r "$NAME" ] && [ -f "$NAME" ]
ou
[[ -r $NAME && -f $NAME ]]
Il est préférable de garder les [ … ]conditions simples car la [commande ne peut pas distinguer facilement les opérateurs de l'opérande. Si $NAMEressemble à un opérateur et apparaît dans une position où l'opérateur est valide, il peut être analysé en tant qu'opérateur. Cela ne se produira pas dans les cas simples présentés dans cette réponse, mais les cas plus complexes peuvent être risqués. L'écriture avec des appels séparés [et l'utilisation des opérateurs logiques du shell évite ce problème.
La seconde syntaxe utilise la [[ … ]]construction conditionnelle qui existe dans bash (et ksh et zsh, mais pas plain sh). Cette construction est une syntaxe spéciale, alors [est analysée comme une autre commande, donc vous pouvez utiliser des choses comme à l' &&intérieur et vous n'avez pas besoin de variables de citation , sauf dans les arguments à certains opérateurs de chaîne ( =, ==, !=, =~) (voir Quand des guillemets doubles nécessaire ? pour plus de détails).