Partage
  • Partager sur Facebook
  • Partager sur Twitter

Script shell qui ne fonctionne pas

Sujet résolu
Anonyme
    26 mai 2016 à 19:44:56

    Bonjour,

    Je souhaiterais faire un script pour m'amuser c'est un script qui vas capter combien de partition de disque il y a puis vas les monter

    #!/bin/sh
    
    # Utilisateur normal
    
    # Je vais dans le dossier utilisateur
    cd
    # Je vais sur le bureau
    cd Desktop/
    # Je fait une variable où je stock le dossier courant
    path=`pwd`
    # Je créer un dossier DMDUR et dedans mountSD
    mkdir -p DMDUR/mountSD
    # Je fait une variable où je stock le dossier de travail
    workdir=$path/DMDUR
    # Je vais dans le dossier dev car les partitions de disques detectés s'y trouve dedans
    cd /dev
    # Je fait une variable où je stock les partitions de disques detectés
    sd=`ls sd??`
    # Je vais dans le dossier où je vais créer les dossiers
    cd $workdir/mountSD
    # Je créer les dossiers
    mkdir $sd
    
    ##############################################
    echo "$sd" > line.txt
    wc -l line.txt > nbline.txt
    head -c 1 nbline.txt > nbsdtotal.txt 
    cut -c -1 nbsdtotal.txt
    nbsdtotal=`cat nbsdtotal.txt`
    nbsdcurrent=1
    while [$nbsdtotal =< $nbsdcurrent]
    	do fileline=`sed -n "$nbsdcurrent p" line.txt`;
    	sudo mount /dev/$fileline $fileline;
    	nbsdcurrent++;
    done
    #rm line.txt nbline.txt nbsdtotal.txt


    la parti qui bug est

    echo "$sd" > line.txt
    wc -l line.txt > nbline.txt
    head -c 1 nbline.txt > nbsdtotal.txt 
    cut -c -1 nbsdtotal.txt
    nbsdtotal=`cat nbsdtotal.txt`
    nbsdcurrent=1
    while [$nbsdtotal =< $nbsdcurrent]
    	do fileline=`sed -n "$nbsdcurrent p" line.txt`;
    	sudo mount /dev/$fileline $fileline;
    	nbsdcurrent++;
    done
    #rm line.txt nbline.txt nbsdtotal.txt

    Merci pour votre aide

    PS : je vais sur mon linux pour vous screen l'erreur

    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      26 mai 2016 à 20:14:50

      Voila les erreur

      ./m.sh: 31: ./m.sh: cannot open 1]: No such file
      ./m.sh: 31: ./m.sh: [7: not found

      • Partager sur Facebook
      • Partager sur Twitter
        26 mai 2016 à 21:16:16

        salut,

        il faut des espaces autour des crochets,
        et =< n'existe pas,
        et des nombres se comparent avec les opérateurs arithmétiques : -eq -lt -gt...

        • 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
          26 mai 2016 à 21:30:28

          D'accord est après ça il y auras d'autre truc a modifier mdr :p merci bien en tous cas :)
          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            27 mai 2016 à 8:02:15

            Ce n'est pas ta demande, mais il faut remarquer que la façon dont tu t'y prends te rend les choses plus difficiles et créera des bugs particulièrement difficiles à résoudre quand on est débutant. Quelques points :

             - ne pas utiliser « ls »  juste pour récupérer une liste de fichiers et itérer dessus, car 1° cela t'oblige ensuite à utiliser tout un tas de commandes en fait inutiles 2° si les fichiers ont des espaces dans leur nom, cela créera des bugs et des comportements inattendus, comme l'effacement de fichiers que tu ne voulais pas effacer

             - utiliser $(commande) plutôt que `commande`, car on peut facilement emboîter les $( ... ) et s'assurer que les espaces sont traités correctement, contrairement à `commande`. Avec $( ... ), tu peux ainsi écrire sans problème avec les espaces dans la valeur des variables :

            variable2="$(commande1 "$(commande2 "$variable1")")"

            - toujours mettre les références aux variables entre guillemets doubles, sauf besoins très particuliers. Entre guillemets, le texte contenu dans la variable n'est pas découpé par le shell aux espaces et les globs comme « * » ne sont pas interprétés, ce qui est le plus souvent ce que l'on veut. Or, les noms de fichiers peuvent contenir des « * », « ? », etc. Donc dans ton script, path devrait toujours être référencé comme ça : "$path", ou "$path/Desktop/MountSD", ou encore "$path"/Desktop/MountSD/* si tu veux un glob

            - on peut faire variable="$(commande)", les fichiers ne sont pas ici nécessaires.

            - utiliser les globs pour faire des boucles ! C'est un point de fort du shell, autant l'exploiter. Dans ce cas, ta boucle principale se ré-écrit de la façon suivante :

            for periph in /dev/sd??; do
                nom="$(basename "$periph")"
                # TODO: vérifier que le dossier n'existe pas déjà en utilisant un bloc if,
                # sinon mkdir émettra une erreur
                mkdir "$nom"
                mount "$periph" "$nom"
            done

             /dev/sd?? est transformé en liste et for ... in ... itère dessus en mettant chaque élément dans periph

            - basename et dirname sont utiles pour manipuler les noms de fichiers, regarde leur page de manuel, elles existent en français, sont courtes et assez souvent utiles.

            - je conseille fortement de mettre au tout début du script « set -e », ça arrête le script à la première erreur, ce qui peut t'éviter quelques soucis, comme effacer des fichiers que tu voulais garder. Tu as aussi « set -x », qui permet de suivre en détail l'exécution du script.

            - le comportement de « if [ ... ]  » est étrange quand on est débutant. Il faut comprendre qu'en fait « [ » est le nom d'une commande. Oui, vraiment. Dans sh (pas bash) :

            $ which [
            /usr/bin/[
            $

            Elle fonctionne comme la commande « test », prend les mêmes options pour faire des comparaisons (-gt, -lt, -eq, =, !=, ...), mais réclame à la fin un crochet fermant. Tout ce que fait if, c'est considérer une commande qui réussie comme « vraie ». test et [ ne sont que des cas particuliers.

            Si tu lis l'anglais http://wiki.bash-hackers.org/ est une ressource incontournable.

            -
            Edité par Anonyme 27 mai 2016 à 8:04:00

            • Partager sur Facebook
            • Partager sur Twitter

            Script shell qui ne fonctionne pas

            × 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