Partage
  • Partager sur Facebook
  • Partager sur Twitter

Aide script comparaison de caractères

    23 février 2018 à 11:41:37

    Bonjour,

    j'ai un petit soucis avec mon script (ci-dessous) j'aimerai qu'il retourne "nicolas.sh" (juste en lui indiquant que le fichier suivant est un .sh) mais quand je lance le script celui-ci ne retourne rien :

    #!/bin/bash
    IN="albert/ouais/nicolas.sh"
    OIFS=$IFS
    IFS='/'
    for x in $IN
    do
    if [ $x == "*.sh" ]
    then
    echo "> [$x]"
    fi
    done



    -
    Edité par NicoDubs 23 février 2018 à 11:42:48

    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      23 février 2018 à 13:05:33

      Salut,

      Tu déclare OIFS avant IFS alors que OIFS doit contenir ce que IFS contient. D'ailleurs, je vois pas trop à quoi sert OIFS ici.

      De plus, pour faire une comparaison avec une regex, il faut une syntaxe différente.

      Toi tu veux faire:

      #!/bin/bash
      IN="albert/ouais/nicolas.sh"
      IFS='/'
      OIFS=$IFS
      for x in $IN
      do
          if [[ "$x" =~ .*\.sh ]] # Ou [[ "$x" == *.sh ]] pour motif glob
          then
          echo "> [$x]"
          fi
      done

      Cependant, ce n'est pas très propre vu que tu compares albert et ouais aussi d'abord. Et je suppose que le but est d'utiliser ce script dans une boucle. Ce qui donnera beaucoup plus d'opérations inutiles.

      Il existe basename ( voir manuel) qui permet d'enlever les dossiers parents du chemin d'un fichier.

      -
      Edité par Anonyme 23 février 2018 à 13:14:22

      • Partager sur Facebook
      • Partager sur Twitter
        23 février 2018 à 14:02:21

        o_O

        ton script ne sert à rien.

        #!/bin/bash
        IN="albert/ouais/nicolas.sh"
        echo "${IN##*/}"
        c'est tout.
        • Partager sur Facebook
        • Partager sur Twitter

        Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique

        Anonyme
          23 février 2018 à 14:10:17

          Ce qu'il veut, c'est un retour uniquement si IN désigne un fichier .sh. Enfin, j'espère, sinon oui, c'est une belle d'ébauche d'énergie ^^

          -
          Edité par Anonyme 23 février 2018 à 14:15:32

          • Partager sur Facebook
          • Partager sur Twitter
            23 février 2018 à 15:31:11

            En fait de base j'ai ce script : (qui me permet de récupérer la différence entre 2 versions d'OSTicket)

            #!/bin/bash
            cd /root/Bureau
            diff -r OSTicket1.8/osTicket-develop/ ticketcusto/osTicket-1.8-custom | grep ticketcusto/osTicket-1.8-custom | awk ‘{print $4}’ > differencecusto.txt #permet de récupérer les différences entre les deux fichiers et les répertories dans differencecusto.txt
            c=$(sed -n '$=' differencecusto1.txt) #permet d'avoir le nombre de lignes dans le fichier texte
            for i in `seq 1 $c`; #boucle pour passer en revu les fichiers 
            do
            	j=$(sed -n $i'p' differencecusto1.txt) #lire les lignes du fichier texte
            	cp -p $j DiffOSTICKETCustom #copier les lignes dans le dossier DiffOSTICKETCustom
            done

            Le problème c'est qu'à lui seul il ne me suffit pas, j'ai besoin d'ajouter des lignes pour que mon script ajoute les fichiers qui sont retournés dans les bons dossiers afin qu'ensuite je puisse appliquer la màj sur une version plus récente (oui une sombre histoire), seulement je suis très loin d'être un cador du scripting ! Je découvre totalement, si quelqu'un peut m'aider et apporter des modifications ça m'aiderai grandement :)

            #!/bin/bash
            cd /root/Bureau
            c=$(sed -n '$=' differencecusto1.txt)
            for i in `seq 1 $c`;
            do
            j=$(sed -n $i'p' differencecusto1.txt)
            case $j in 
            	*/include/"*.php")
            		fich=$(basename "$j")
            		mv /root/Bureau/DiffOSTICKETCustom/$fich /root/Bureau/DiffOSTICKETCustom/include
            		echo "$fich a ete deplace dans le dossier /include"
            		;;
             	*/include/cli/modules/file.php)
            		fich=$(basename "$j")
            		mv /root/Bureau/DiffOSTICKETCustom/$fich /root/Bureau/DiffOSTICKETCustom/include/cli/modules
            		echo "$fich a ete deplace dans le dossier /include/cli/modules/"
            		;;
            	*/include/i18n/en_US/*)
            		fich=$(basename "$j")
            		mv /root/Bureau/DiffOSTICKETCustom/$fich /root/Bureau/DiffOSTICKETCustom/include/i18n/en_US
            		echo "$fich a ete deplace dans le dossier /include/i18n/en_US"
            		;;
            	*/include/staff/"*")
            		fich=$(basename "$j")
            		mv /root/Bureau/DiffOSTICKETCustom/$fich /root/Bureau/DiffOSTICKETCustom/include/staff
            		echo "$fich a ete deplace dans le dossier /include/staff"
            		;;
            	*/include/staff/templates/*)
            		fich=$(basename "$j")
            		mv /root/Bureau/DiffOSTICKETCustom/$fich /root/Bureau/DiffOSTICKETCustom/include/staff/templates
            		echo "$fich a ete deplace dans le dossier /include/staff/templates"
            		;;
            	*)
            		fich=$(basename "$j")
            		echo "$fich n'a pas ete deplace"
            esac
            done



            Evidemment la comparaison dans le case ne marche pas j'ai essayé =~ et == mais bon je poste ce que j'ai écris pour que vous compreniez le contexte mais il est faux.



            -
            Edité par NicoDubs 26 février 2018 à 16:02:49

            • Partager sur Facebook
            • Partager sur Twitter
              23 février 2018 à 21:36:51

              je suis très loin d'être un cador du scripting

              oh, tu sais, tu peux le dire : tu es un total débutant, et tu fais n'importe quoi, parce que tu n'as pas lu la doc dispos.

              un fichier se lit avec une boucle while :

              while read line; do : whatever with "$line"; done < fichier

              et il est préférable de présenter un échantillon représentatif du fichier à traiter, et du résultat correspondant attendu.

              case/esac (le shell tout entier) obéit à une syntaxe fixe :

              case MOT in [MOTIF [| MOTIF]...) COMMANDES ;;]... esac


              en général, on ne change pas de répertoire dans un script : on concatène le répertoire au nom du fichier à traiter.

              dans ton script, dans tous les cas, le répertoire est le même. :/

              pour obtenir le résultat d'une commande dans une variable il faut utiliser une substitution de commande.
              la forme `cmd` est vieillotte, et peu pratique à imbriquer; maintenant on utilise $(cmd).

              il faut lire le tutoriel relatif au shell (Reprenez le contrôle avec linux) sur le site d'OpenClassRooms !!!

              et avant d'écrire un script, on écrit un algorithme en pseudo-code.

              -
              Edité par dantonq 23 février 2018 à 21:37:16

              • Partager sur Facebook
              • Partager sur Twitter

              Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique

              Aide script comparaison de caractères

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown