Forum Programmation.shell Interpréter une variable une seule fois

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
0
22
oct.
2018

Bonjour,

En supposant que l'utilisateur tape une commande.

read mot
$mot >> temp

Du coup lorsque l'utilisateur a bien tapé une commande par exemple "ls" je me retrouve logiquement avec la liste des fichiers et répertoire du répertoire courant dans le fichier temp, alors que j'aurai voulu uniquement qu'il y est marqué "ls" dans le fichier temp sans que se soit interprété si quelqu'un sait comment faire.

Merci

  • # Shell

    Posté par  (Mastodon) . Évalué à 2. Dernière modification le 22 octobre 2018 à 19:15.

    La règle de base du shell, c'est que le premier "terme" que tu tapes est une commande, et les autres "termes" sont les paramètres.

    read mot => la commande c'est read, et le paramètre mot
    $mot >> temp => la commande est $mot

    Le shell va donc regarder ce que vaut cette variable pour savoir quelle commande exécuter. Si $mot vaut ls , il est donc parfaitement normal qu'il t'exécute un ls.

    Toi ce que tu veux comme commande c'est tout simplement echo qui affiche (entre autre) le contenu d'une variable.

    read mot
    echo $ls >> temp

    En théorie, la théorie et la pratique c'est pareil. En pratique c'est pas vrai.

    • [^] # Re: Shell

      Posté par  . Évalué à 3.

      Et tant qu'à faire, mettre ce $mot (et pas $ls 😉) entre guillemets doubles, pour que ça fonctionne quoi que tape l'utilisateur.

      • [^] # Re: Shell

        Posté par  (Mastodon) . Évalué à 2. Dernière modification le 22 octobre 2018 à 19:17.

        oui tu as raison. perso je préfère d'ailleurs les accolades.

        echo "$ls" >> temp
        echo ${ls} >> temp

        En théorie, la théorie et la pratique c'est pareil. En pratique c'est pas vrai.

        • [^] # Re: Shell

          Posté par  (Mastodon) . Évalué à 2.

          pardon, c'est bien évidemment $mot qu'il faut lire dans les différents exemples :)

          En théorie, la théorie et la pratique c'est pareil. En pratique c'est pas vrai.

        • [^] # Re: Shell

          Posté par  . Évalué à 8.

          Non, ce n'est pas la même chose, la syntaxe ${…} permet de protéger le nom de la variable, par exemple si le caractère juste après serait pris lui-même comme faisant partie du nom de la variable, mais il faut quand même le protéger par des guillemets.

          Exemple:

          $ opt='/ -ld'
          $ ls $opt
          drwxr-xr-x 20 root renaud 4096 aoû 15  2017 //
          $ ls "$opt"
          ls: impossible d'accéder à '/ -ld': Aucun fichier ou dossier de ce type
          $ ls ${opt}
          drwxr-xr-x 20 root renaud 4096 aoû 15  2017 //
          $ ls "${opt}"
          ls: impossible d'accéder à '/ -ld': Aucun fichier ou dossier de ce type
          
          • [^] # Re: Shell

            Posté par  (Mastodon) . Évalué à 2. Dernière modification le 22 octobre 2018 à 22:10.

            Merci !

            En théorie, la théorie et la pratique c'est pareil. En pratique c'est pas vrai.

      • [^] # Re: Shell

        Posté par  (site web personnel) . Évalué à 7.

        Et re-tant qu'à faire, ne pas utiliser echo sur une donnée venant de l'utilisateur et qui pourrait commencer par -. Pour être robuste, préférer printf :

        printf '%s' "$mot" >> temp
        

        Mais je pinaille un peu là.

        • [^] # Re: Shell

          Posté par  . Évalué à 6.

          Certes, mais puisqu'on en est à pinailler, ton exemple n'est pas tout à fait équivalent, car echo termine (par défaut) par une retour à la ligne, contrairement à printf.
          Donc il faut faire:

          printf '%s\n' "$mot" >> temp
          

          Allez, au suivant, il y a surement encore moyen de pinailler!

          • [^] # Commentaire supprimé

            Posté par  . Évalué à -2. Dernière modification le 09 décembre 2018 à 10:58.

            Ce commentaire a été supprimé par l’équipe de modération.

  • # echo

    Posté par  . Évalué à 1. Dernière modification le 22 octobre 2018 à 19:16.

    Bonjour

    michel@debg53sw:~$ cat monscript.sh     # j'affiche le contenu de mon script shell exécutable   
    #!/bin/bash
    
    read mot
    echo "$mot" >> temp
    
    michel@debg53sw:~$
    michel@debg53sw:~$ cat temp             # j'affiche le contenu du fichier nommé 'temp'
    avant…
    michel@debg53sw:~$
    michel@debg53sw:~$ ./monscript.sh       # Je lance mon script et j'entre 'ls'
    ls
    michel@debg53sw:~$
    michel@debg53sw:~$ cat temp             # j'affiche le contenu du fichier nommé 'temp'
    avant…
    ls
    michel@debg53sw:~$
    • [^] # Commentaire supprimé

      Posté par  . Évalué à 1. Dernière modification le 09 décembre 2018 à 11:01.

      Ce commentaire a été supprimé par l’équipe de modération.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.