Résolu le 25-04-20 Modification simple de chaîne sous Bash

Questions concernant les lignes de commandes
Répondre
Avatar du membre
Christian_B
Messages : 438
Enregistré le : lun. 7 nov. 2016 10:44
Localisation : Paris

Modification simple de chaîne sous Bash

Message par Christian_B »

Bonjour,
Quoique peu familier du shell, j'ai fait un petit script de sauvegarde de mes fichiers de config qui marche presque.
Mais je bute sur ce qui me paraît être une absence (étonnante) de fonctions de chaînes dans Bash.
Je rentre veux rentrer interactivement le chemin du volume de sauvegarde.
Pour créer ensuite sans problèmes le chemin complet, je teste si le chemin rentré se termine par '/' :

Code : Tout sélectionner

if [[ ${$Rep: -1} == "/"]] then ;  # Retirer le '/' Rep=".........." 
Le problème est clairement posé : je ne sais même pas retirer le '/' final s'il y est :(

Est-ce une commande interne, une expression de chaîne permettant des opérations simples (je n'en ai pas trouvé), une commande externe ? Mystère.
J'espère quand même qu'il ne faudra pas que je me mette aux expressions régulières pour faire ça.
Quelqu'un connaissant mieux le shell que moi a-t-il la solution ?
Merci.
Linux Mint 21.3 Mate 1.26.0. Carte Gigabyte H81N.
Intel Core i7-4770 : 4x2 cœurs + Xeon E3-1200 (= circuit 4600), sans carte graphique.
Mémoire 8 Go Dual channel, SSD 120Go, HD 2To.
Les armes nucléaires sont interdites depuis le 22 janvier 2021. Y a plus qu'à ...

Avatar du membre
cyrille
Administrateur du site
Messages : 12285
Enregistré le : mar. 19 sept. 2017 08:49
Localisation : Nowhere
Contact :

Re: Modification simple de chaîne sous Bash

Message par cyrille »

Pour créer ensuite sans problèmes le chemin complet, je teste si le chemin rentré se termine par '/' :
A quoi cela te sert il ce test par le slash final ? Tu veux savoir si tu es bien dans un dossier c'est cela ?

Si c'est bien cela

Code : Tout sélectionner

$REPERTOIRE = /path/to/the/dir

if [ -d $REPERTOIRE ]; then
        echo "le dossier existe..."
   else
        echo "le dossier n'existe pas on le crée"
        mkdir -p $REPERTOIRE
fi
Si je suis à coté de la plaque, tu peux réexpliquer ta demande ;)
?séuqartéd sel ruoP / sécnoféd sel ruoP / sreiruréB sel ruoP / ?étéicos elleuQ

https://crust.ovh

Avatar du membre
cyrille
Administrateur du site
Messages : 12285
Enregistré le : mar. 19 sept. 2017 08:49
Localisation : Nowhere
Contact :

Re: Modification simple de chaîne sous Bash

Message par cyrille »

Tiens si tu veux eviter les regex et ce n'est pas un répertoire à tester

Code : Tout sélectionner

#!/bin/sh

# Récupère un variable passée en argument
chaine=$1

# Affiche la variable
echo $chaine

# Affiche la dernière lettre de la variable
echo -n  $chaine | tail -c 1

# Recupère la dernière lettre de la variable dans une autre variable
derniereLettre=$( echo -n  $chaine |  tail -c 1 )


# On affiche cette dernirère
echo $derniereLettre

# Test si cette dernière lettre est un slash ou non
if [ $derniereLettre = "/" ]; then
	echo "fini par /"
  else
       echo "Ne fini pas par /"
fi
Tu le nommes comme tu veux, il récupère la variable à tester au premier argument passer au script
Exemple si tu le nommes test.sh

test.sh maVariable la variable sera maVariable
test.sh maVariable/ la variable sera maVariable/

Tu devrais t'en sortir...

Ensuite les regex c'est bien aussi
?séuqartéd sel ruoP / sécnoféd sel ruoP / sreiruréB sel ruoP / ?étéicos elleuQ

https://crust.ovh

Avatar du membre
cyrille
Administrateur du site
Messages : 12285
Enregistré le : mar. 19 sept. 2017 08:49
Localisation : Nowhere
Contact :

Re: Modification simple de chaîne sous Bash

Message par cyrille »

Marrant comme problématique
Allez une autre variante

Code : Tout sélectionner

#!/bin/sh

# Récupère un variable passée en argument
chaine=$1

# test direct

if [ $(echo $chaine | cut -c $((${#chaine})))  = "/" ]; then
	echo "fini par /"
  else
       echo "Ne fini pas par /"
fi
?séuqartéd sel ruoP / sécnoféd sel ruoP / sreiruréB sel ruoP / ?étéicos elleuQ

https://crust.ovh

Avatar du membre
cyrille
Administrateur du site
Messages : 12285
Enregistré le : mar. 19 sept. 2017 08:49
Localisation : Nowhere
Contact :

Re: Modification simple de chaîne sous Bash

Message par cyrille »

Sinon c'est le genre de skeud qui se code très bien en python et pourquoi pas en interface GTK (tkinter, bof bof...)
?séuqartéd sel ruoP / sécnoféd sel ruoP / sreiruréB sel ruoP / ?étéicos elleuQ

https://crust.ovh

Avatar du membre
cyrille
Administrateur du site
Messages : 12285
Enregistré le : mar. 19 sept. 2017 08:49
Localisation : Nowhere
Contact :

Re: Modification simple de chaîne sous Bash

Message par cyrille »

Tu vas dire que je réponds par morceaux, donc si tu veux tout sauf le dernier caractère (vu que c'est ça ta réelle question -- j'avais lu trop vite la première fois --)

Code : Tout sélectionner

# Tout sauf le dernier caractère
 echo "Tout sauf le dernier caractère : ${chaine%?}"
Doc (entre autre)
https://www.learnshell.org/en/Basic_String_Operations
https://abs.traduc.org/abs-5.0-fr/ch09s02.html
https://www.supinfo.com/articles/single ... teres-bash
?séuqartéd sel ruoP / sécnoféd sel ruoP / sreiruréB sel ruoP / ?étéicos elleuQ

https://crust.ovh

Avatar du membre
Christian_B
Messages : 438
Enregistré le : lun. 7 nov. 2016 10:44
Localisation : Paris

Re: Modification simple de chaîne sous Bash

Message par Christian_B »

cyrille a écrit :Tu veux savoir si tu es bien dans un dossier c'est cela ?
Non, comme indiqué, je veux retirer le '/' final de $Rep s'il y est.
$Rep à ce moment là est le chemin du volume à utiliser.

Le but est de le concaténer avec le chemin du répertoire de sauvegarde dans le volume (calculé ensuite selon la date) pour obtenir un chemin complet. Je veux éviter d'avoir deux cas de figure selon que le chemin du volume est entré avec un / final ou pas.
Sinon je devrais écrire deux expressions presque identiques pour le chemin complet selon le cas.
Ce serait de la mauvaise programmation et m'obligerait par la suite éventuellement à faire deux fois toutes les modifications sur la définition du chemin complet.

Ta suggestion :
cyrille a écrit :

Code : Tout sélectionner

echo "Tout sauf le dernier caractère : ${chaine%?}"
m'a donné la solution, même si je n'ai pas tout compris.
Comme dans mon cas il s'agissait de modifier $Rep, j'ai testé par :

Code : Tout sélectionner

#! /bin/bash
Rep="~/hd1/" ;
Rep="${Rep%?}"
 echo $Rep
Et j'ai bien '~/hd1/' en retour (sans les apostrophes). C'est exactement ce que je voulais.
Merci cyrille.
Va falloir que j'étudie de près ce genre d'expression, sauf si je me mets rapidement à Tcl où la commande string est moins compacte mais aussi moins cabalistique.
En attendant, sauvé, je vais échapper à python (qui me donne des boutons) et à GTK. 8-)
Linux Mint 21.3 Mate 1.26.0. Carte Gigabyte H81N.
Intel Core i7-4770 : 4x2 cœurs + Xeon E3-1200 (= circuit 4600), sans carte graphique.
Mémoire 8 Go Dual channel, SSD 120Go, HD 2To.
Les armes nucléaires sont interdites depuis le 22 janvier 2021. Y a plus qu'à ...

Répondre