2015-10-21 3 views
0

J'essaie d'écrire un script bash qui boucle sur les répertoires qui commencent par l'une des deux chaînes dans un dossier donné. J'ai écrit ce qui suit:plusieurs conditions sur 'if'

for aSubj in /wherever/* 
    if [ [ -d $aSubj ] && [ [ $aSubj == hu* ] || [ $aSubj == ny* ] ] ]; then 
     . 
     . 
    fi 
done 

Lorsque je tente et exécuter ce que je reçois une erreur de syntaxe sur la ligne du « si »: toute erreur de syntaxe près de jeton inattendu « si »

peut indiquer où je Je vais mal?

+1

Votre utilisation de '[' et '[[' semble un peu aléatoire. –

+0

Chaque condition a juste un '[', mais certains d'entre eux sont imbriqués –

+1

Pourquoi essayez-vous de les imbriquer? –

Répondre

1

La 1ère ligne doit être

for aSubj in /wherever/*; do 
+0

* head smack * merci ... –

+0

J'ai une autre question - la variable aSubj se termine par le chemin complet du fichier (c'est-à-dire,/anywhere/aSubj). Comment puis-je obtenir la variable juste le nom du répertoire? –

1

Si vous voulez parler de plusieurs conditions, il suffit de les nids avec ():

$ d=23 
$ ([ $d -ge 20 ] && [ $d -ge 5 ]) || [ $d -ge 5 ] && echo "yes" 
yes 

Cependant, dans ce cas, vous pouvez utiliser une expression régulière comme décrit dans Check if a string matches a regex in Bash script:

[[ $aSubj =~ ^(hu|ny)* ]] 

Cette vérification si le contenu de la variable $aSubj commence par hu ou ny.

Ou même d'utiliser l'expression régulière pour récupérer les fichiers. Par exemple, ce qui suit correspondra à tous les fichiers ttt/ répertoire dont le nom commence par soit a ou b:

for file in ttt/[ab]* 

Notez que vous pouvez aussi nourrir votre boucle avec l'aide d'un process substitution avec find contenant une expression régulière (échantillons en How to use regex in file find):

while IFS= read -r file 
do 
    # .... things 
done < <(find your_dir -mindepth 1 -maxdepth 1 -type d -regex '.*/\(hu\|ny\).*') 

Par exemple, si je les dirs suivants:

$ ls dirs/ 
aa23 aa24 ba24 bc23 ca24 

-je obtenir ce résultat si je cherche des répertoires dont le nom commence par soit ca ou bc:

$ find dirs -mindepth 1 -maxdepth 1 -type d -regex '.*/\(ca\|bc\).*' 
dirs/bc23 
dirs/ca24