Contenu | Rechercher | Menus

Annonce

DVD, clés USB et t-shirts Ubuntu-fr disponibles sur la boutique En Vente Libre

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 28/11/2021, à 14:55

PowaBanga

Bash condition && || semblent ne pas fonctionner

Salut à tous !

J'essaye actuellement de faire un script de manipulation de recherche, je lance donc une recherche sur toutes les lignes d'un fichier et je souhaite n'afficher que les lignes ayant des résultat (elles se terminent toute par ".wal), et se terminant uniquement par certains type d'extention (.wal, .png, .jpg, .tga).
   

for i in $(cat monfichier.txt)
do
  e=$(find mondossier -iname "$(echo $i|sed 's/.wal//g;s/+//g' | awk -F/ '{print $NF}').*")
  o=$(echo $i | awk -F. '{print $NF}')
  p=$(echo -n $e | wc -c)
  if [[ $p -gt 0 ]] && [[ $o = png ]] || [[ $o = jpg ]] || [[ $o = tga ]] || [[ $o = wal ]]
  then
      echo -e "\e[38;5;46m$i\e[38;5;15m"
      echo "$e"
  fi
done

le problème, c'est que quoi que je fasse, ça imprime tout !

Hors ligne

#2 Le 28/11/2021, à 15:21

pingouinux

Re : Bash condition && || semblent ne pas fonctionner

Bonjour,
Ton script est trop compliqué. Le mieux serait de donner un petit exemple de fichier et le résultat que tu veux.
Pour commencer, il faut remplacer

for i in $(cat monfichier.txt)
do
  ..............................................
done

par

while read i
do
  ..............................................
done < monfichier.txt

Ajouté : Mais il n'est peut-être même pas nécessaire de faire cette boucle

Dernière modification par pingouinux (Le 28/11/2021, à 15:22)

Hors ligne

#3 Le 28/11/2021, à 15:45

geole

Re : Bash condition && || semblent ne pas fonctionner

Bonjour
essayer

grep -E  ".wal$|.png$|.jpg$|.tga"   monfichier.txt

De la même façon, vous devez utiliser l'ancre $ à la fin d'un modèle pour indiquer que la correspondance ne sera valable que si elle se trouve à la fin d'une ligne.

En ligne

#4 Le 28/11/2021, à 15:46

Watael

Re : Bash condition && || semblent ne pas fonctionner

  if test $p -gt 0 && test "$o" = "png" -o "$o" = "jpg" -o "$o" = "tga" -o "$o" = "wal"

ou

if (( $p )) && [[ $o =~ (png|jpg|tga|wal)$ ]]

pingouinux a raison. Ton script est trop compliqué : il comporte trop de commandes externes, qui pourraient être remplacées par des Remplacements de paramètres pour la plupart
et pourquoi ne pas lancer la recherche en filtrant d'abord le fichier, comme l'indique Geole, ou en décomposant le test de ton script :
d'abord tester la fin des lignes
faire la recherche
puis tester le nombre de résultat (>0)

Dernière modification par Watael (Le 28/11/2021, à 15:50)


Welcome to sHell. · eval is evil.

Hors ligne

#5 Le 28/11/2021, à 15:48

PowaBanga

Re : Bash condition && || semblent ne pas fonctionner

je pense que tu n'a pas bien compris ce que j'essayais d'expliquer, je ne cherche donc pas à imprimer le résultat dans un fichier, je veux juste afficher la réponse dans mon terminal de façon structurée.

Je reconnais toutefois avoir simplifié mon script pour concentrer l’intérêt du lecteur sur ce qui ne fonctionne pas dans mon script.

Si tu veux pouvoir mieux comprendre ce que j'essaye de faire :

  • il y donc dans ce dossier tout un tas de fichiers texte, dont j'extrais l'information qui m'intéresse dans le fichier "no_such_file_or_directory.txt" (=monfichier.txt)

  • Pour chaque ligne de ce fichier, je lance une recherche plus globale dans le dossier Textures, pour voir si je la trouve ailleur

  • S'il en existe un, et qu'il est bien au format .wal, .png, .jpg, ou .tga

  • alors j'affiche le résulta dans la console avec des couleurs, et en affichant dans quel fichier texte celui qui est recherché à été trouvé

ce qui au final ma résulté sur ce script :

#!/bin/bash
grep -hr ".wal: No such" dday/condumps | sed 's/open_file_read: //g; s/open_from_disk: .\/dday\///g' | sort | uniq > dday/condumps/no_such_file_or_directory.txt


for i in $(cat dday/condumps/no_such_file_or_directory.txt | sed 's/: No such.*//g')
do
  e=$(find dday/textures -iname "$(echo $i|sed 's/.wal//g;s/+//g' | awk -F/ '{print $NF}').*" | sed 's/dday\///g')
  o=$(echo $i | awk -F. '{print $NF}')
  p=$(echo -n $e | wc -c)
  if [[ $p -gt 0 ]] && [[ $o = png ]] || [[ $o = jpg ]] || [[ $o = tga ]] || [[ $o = wal ]]
    then
        echo -e "\e[38;5;46m$i\e[38;5;15m"
        echo "$e"
        echo -e "\e[38;5;226m$(grep -r -l $i dday/condumps| sed 's/.txt.*//g;s/dday\/condumps\///g;/^no_such/d' | sort | uniq | tr '\n' ' ' ; echo)\e[38;5;15m"
    else
      true
  fi
done

Ce qui me pose problème ici, c'est donc surtout que cette partie là du script ne fonctionne pas dans mon bash

  if [[ $p -gt 0 ]] && [[ $o = png ]] || [[ $o = jpg ]] || [[ $o = tga ]] || [[ $o = wal ]]
    then
        echo -e "\e[38;5;46m$i\e[38;5;15m"
        echo "$e"
        echo -e "\e[38;5;226m$(grep -r -l $i dday/condumps| sed 's/.txt.*//g;s/dday\/condumps\///g;/^no_such/d' | sort | uniq | tr '\n' ' ' ; echo)\e[38;5;15m"
    else
      true
  fi

[Édit]

houuu Merci infiniment Watael !!! j'ai donc opté pour ceci !!!

if (( $p )) && [[ $o =~ (png|jpg|tga|wal)$ ]]

Dernière modification par PowaBanga (Le 28/11/2021, à 15:50)

Hors ligne

#6 Le 28/11/2021, à 20:41

kamaris

Re : Bash condition && || semblent ne pas fonctionner

Sinon en mode POSIX il te manquait un groupement de commandes :

if [[ $p -gt 0 ]] && { [[ $o = png ]] || [[ $o = jpg ]] || [[ $o = tga ]] || [[ $o = wal ]]; }

Dernière modification par kamaris (Le 28/11/2021, à 20:42)

Hors ligne

#7 Le 28/11/2021, à 21:51

Watael

Re : Bash condition && || semblent ne pas fonctionner

mais, [[ n'est pas POSIX.

une version POSIX est la première version que j'ai donnée.


Welcome to sHell. · eval is evil.

Hors ligne

#8 Le 28/11/2021, à 22:33

kamaris

Re : Bash condition && || semblent ne pas fonctionner

Oui tu as raison désolé, j'étais focalisé sur le manque de regroupement et je n'ai pas noté les [[, probablement d'autant plus qu'ils ne sont pas nécessaires :

if [ $p -gt 0 ] && { [ $o = png ] || [ $o = jpg ] || [ $o = tga ] || [ $o = wal ]; }

est bien POSIX, mais ta version l'est aussi bien sûr (je ne l'avais pas vue en première lecture en fait).

Hors ligne

#9 Le 28/11/2021, à 22:35

PowaBanga

Re : Bash condition && || semblent ne pas fonctionner

Merci pour vos réponses en tout cas, c'est super instructif !

Hors ligne