1 votes

Basic script listant les répertoires ([ : discover : opérateur inattendu)

Je rencontre un problème en exécutant un script basique listant les répertoires.

for item in *
do
   if [ -d $item ]
   then
      echo $item
   fi
done

Le résultat :

  1. liste tous les dossiers du système
  2. renvoie une erreur : for.sh : 4 : [ : découvrir : opérateur inattendu
  3. liste tous mes dossiers, dont les noms commencent par un caractère minuscule

Je suppose que -d trouve un problème avec un caractère initial minuscule ? Quelqu'un peut-il m'expliquer pourquoi cela se produit ? Merci beaucoup par avance.

0voto

Carra Points 6832

Ce qui suit fait écho à tous les répertoires dans le répertoire courant (mais pas les répertoires en pointillés, par ex. .git )

#!/bin/bash

find . -maxdepth 1 -mindepth 1 -type d | while read Directory; do
    echo "$Directory";
done

0voto

edwin Points 3659

Certains répertoires/fichiers peuvent contenir des espaces dans leur nom, ce qui entraîne l'erreur que vous obtenez. Utilisez donc des guillemets :

for item in *
do
   if [ -d "$item" ]
   then
      echo "$item"
   fi
done

si vous voulez les trier par ordre alphabétique, utilisez

for item in *
do
   if [ -d "$item" ]
   then
      echo "$item"
   fi
done | sort

Pour illustrer le problème, supposons qu'un fichier s'appelle My File . Si vous n'utilisez pas les guillemets, vous obtiendrez (après l'expansion de bash)

if [ -d My File ]

donc c'est comme "Test : Is My un répertoire ? Est-ce que File ", mais File n'est pas un test opérateur, d'où l'erreur.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X