• [^] # Quelques explications

    Posté par . En réponse au message Le tout en une ligne de commmande !!!!! On peut le faire ???. Évalué à 3.

    Je pense que j'ai buggé dans mon premier post : la bonne syntaxe est bien ${file...

    Je précise encore que beaucoup de ces expressions peuvent ne pas fonctionner si on n'utilise pas bash.

    Concernant l'expression ${file##+([^0-9])}, voici les explications :
    - la variable file contient une chaîne composée de lettres et de chiffres.
    - le "##" dit qu'il faut renvoyer la chaine $file à laquelle on aura enlevé la plus longue chaine, placée au début de $file, et correspondant au motif qui suit
    - le motif est +([^0-9]) : c'est une chaine contenant un ou plusieurs (+) caractères NON (^) numériques (0-9)

    Donc si $file vaut archive310114650, ça va renvoyer 310114650. Si $file vaut file310114650, ça renvoit également 310114650.

    Cette expression devrait fonctionner avec ksh, du moins avec pdksh sur mon linux. Sur un AIX avec ksh, je viens de tester ça, qui semble fonctionner :
    ${file##+([a-zA-Z])}
    -> enlève tous les caractères alphabétiques du début.
    ou alors
    ${file##+([!0-9])}
    (semble fonctionner également avec bash : on utilise ! pour la négation au lieu de ^)

    Avec la syntaxe $(<expression>), on récupère la sortie standard de <expression>. Ça doit également marcher avec ksh. La syntaxe "standard" (pour sh) est plutôt `<expression>` (avec des backquotes), mais c'est un peu moins souple...

    MORALITÉ ; les shells ont beaucoup évolué depuis sh, mais en rompant la compatibilité. On peut faire beaucoup de chose avec, mais si on veut quelque chose de portable, il faut faira TRÈS attention et tester sur les différents environnements cibles.

    JJD