Sript shell : supprimer le dernier ... - ... caractère d'une chaine

(et ben, on peut pas beaucoup écrire dans le titre du post)
Bonjours à tous.

Juste une petitie question : comment puis-je supprimer le dernier caractère d’une chaine dans un script shell ???
Pour le moment j’utilise :

str=“n’importe quelle chaine de caractères”
bb=expr length $str
str=expr substr $str 1 $((bb-1))

mais ça ne me plait pas, et en plus sous Unix j’ai l’impression que ça ne marche pas.
(j’aurais besoin que le script soit compatible Linux/Unix)

Merci d’avance :slight_smile:
Sylvain

sed s/"$str$"/""/ ptêt ?

ça me répond

sed: command garbled: s/loooool/$//

Salut,

Essaie ça :

[jp@Mandrake tmpfs]$ expr "bonjour" : "\(.*\).$"
bonjou

:wink:

jipicy =>

vescoves-malakoff[~] expr "bonjour" : "\(.*\).$"
Illegal variable name.

(par contre sous Linux ça marche bien)

et si je met la ligne suivante dans mon script,

echo `expr $str : "\(.*\).$"`

et bien ça me renvoi la chaine en ENTIER
(par contre sous Linux ça marche bien)

tu utilises quoi unix et comme shell ???

C’est quoi ton shell ? et sous quel OS ?

Par contre :

echo `expr $str : "\(.*\).$"`

et bien ça me renvoi la chaine en ENTIER

Faut "quoter" la variable "$str" sinon ça génère une erreur (du moins sous Linux et en bash)

SunOS 5.9 et comme shell je sais pas (je peu savoir ça comment?)
En tout cas je commence mon script comme ça : #! /bin/bash

Sinon en ce qui concerne les doublequotes, ben ça me fait la m^eme chose, ça n’enleve rien :confused:

Normalement pour savoir son shell de connexion faut regarder dans "/etc/passwd" :

cat /etc/passwd | grep $USER

pour affiner tu peux rajouter :

cat /etc/passwd | grep $USER | awk -F ":" '{ print $7 }'

Je pense que ton shell de connexion doit être le "C-shell" (csh ou tcsh).

Je reste perplexe par contre que ton script "bash" ne puisse pas interpréter la commande !!! :??: :confused:

arggg

désolé de vous avoir embété, la ligne marche dans le script … j’avais oublié que j’avais rajouté un caractère en amont dans le code, et du coup ben ça enlevait ce dernier … donc je voyais pas de différence. :ane:

vraiment désolé :frowning:

En tout cas merci pour cette aide, je vais m^eme vous offir en cadeau le script supra interessant, méga utile et surtout magnifiquement optimisé :whistle:

#! /bin/bash

if test -n "$1"; then
  path=$1"/"
else
  path="./"
fi

pos=">"

function liste ()
{
 for file in `ls -1 $1`
 do
   echo $pos$file
   if test -d $1$file; then
     pos=$pos">"
     liste $1$file"/"
     pos=`expr "$pos" : "\(.*\).$"`
   fi
 done
}

if test "$aa" = /
 then
   path2=$path
 else
   path2=$PWD"/"$path
fi
echo "========"$path2
liste $path

PS : ben en fait ça fait juste une arborescence des fichiers, si ça se trouve y’a une fonction qui le fait mais j’avais envi de découvrir l’univers des scripts :super:

Y’a pô d’mal :wink:

Eessaye la commande "tree" :sol:

:clap:

ha ben zut, faut pas qu’il y ai un espace, sinon ça me coupe le fichier en deux :confused:

faut dire, je sais pas comment on gère les espaces, parce que j’avais essayé de mettre des espaces à la place du chevron mais ça marche pas, il doit pas s’occuper des espaces en début de ligne :confused:

Tiens essaye ça :

function liste ()
{
for file in `ls -1 $1 | sed 's/ //'`
do
  echo "${pos}${file}"
  if test -d $1${file}; then
    pos=`echo -e "$pos\t>"`
    liste $1${file}"/"
    pos=`expr "$pos" : "\(.*\).$"`
  fi
done
}

for file in ls -1 $1[b] | sed 's/ //'[/b]
Élimine les espaces dans les noms de fichiers

pos=echo -e "$pos\t>"
Ajoute une tabulation entre les 2 "chevrons"

dis moi, pourquoi quand je fais ça :

pos=`echo -e "\t"$pos`

ça marche pas ???
le but étant bien sur de rajouter une tabulation devant le chevron

Parce qu’il faut prendre tout le motif entre les guillemets :

pos=`echo -e "\t$pos>"`

Non mais en fait maintenant au lieu de rajouter à la fin un chevron, je voudrai ajouter au debut une tabulation. Donc en reprenant ton code ce serrai :

 pos=`echo -e "\t$pos"`

mais les tabulation en début de ligne ne semblent pas ^etre prisent en compte :frowning:

Ben apparemment si :

[jp@Mandrake tmpfs]$ var=bonjour
[jp@Mandrake tmpfs]$ echo -e "\t$var"
        bonjour
[jp@Mandrake tmpfs]$ echo -e "\t$var" "\tAu revoir"
        bonjour         Au revoir
[jp@Mandrake tmpfs]$

j’arrive à la bourre, mais :

:slight_smile:

Mieux vaut tard que jamais ;-))
Bien vu !
Juste un truc, le “g” est inutile non ? Vu que forcément y’a plus rien après ;-)))