OVH Cloud OVH Cloud

[Bash] Dernier element

8 réponses
Avatar
MrBuG
Bonsoir a tous,

J'ai un problème tout bète, je n'arrive pas à obtenir la valeur
du dernier element d'une entrée (element n) dans un script
bash.

Exemple :

./element.sh maison vaisselle tv toutou chat

LE dernier argument est chat.


#!/bin/sh

# $1 premier argument
# $* tous les arguments
# $# nb d'arguments

echo "LE dernier argument est ${$#}"

La syntaxe ne marche pas, mais en gros je voudrais récuperer la
valeur via le nombre d'element $# (indice).
$# me donnant 5, ${$#} devrait me donner $5 donc chat.

Merci de votre aide.

--
Mr. Bug

8 réponses

Avatar
Stephane Chazelas
2003/10/26, 17:34(+00), MrBuG:
J'ai un problème tout bète, je n'arrive pas à obtenir la valeur
du dernier element d'une entrée (element n) dans un script
bash.


eval "dernier=$$#"

ou avec bash mais non-portable:

dernier=${@: -1}

--
Stéphane ["Stephane.Chazelas" arobase "free.fr"]

Avatar
William
On Sun, 26 Oct 2003 18:34:23 +0100, MrBuG wrote:

Bonsoir a tous,

J'ai un problème tout bète, je n'arrive pas à obtenir la valeur du
dernier element d'une entrée (element n) dans un script bash.

echo "LE dernier argument est ${$#}"


tiens j'avais pensé que ça marcherait enfin bon voilà une roue de secours
désolé 'ai pas trouvé plus court.

#!/bin/sh
last_argument=`echo $@|awk '{print $NF}'`

--
William.

Avatar
Tux
Stephane Chazelas wrote:

2003/10/26, 17:34(+00), MrBuG:
J'ai un problème tout bète, je n'arrive pas à obtenir la valeur
du dernier element d'une entrée (element n) dans un script
bash.


eval "dernier=$$#"

ou avec bash mais non-portable:

dernier=${@: -1}

En général j'utilise ${!#}


c'est portable ou spécifique à bash ?


Avatar
Stephane Chazelas
2003/10/26, 22:01(+00), Tux:
[...]
dernier=${@: -1}

En général j'utilise ${!#}


c'est portable ou spécifique à bash ?


Meme niveau de portabilité que ${@: -1}: bash2 et ksh93.

Avec zsh, ça serait ${(P)#}

eval dernier=$$#

marche avec tous les shells Bourne-like.

--
Stéphane ["Stephane.Chazelas" arobase "free.fr"]


Avatar
Stephane Chazelas
2003/10/26, 20:33(+01), William:
[...]
#!/bin/sh
last_argument=`echo $@|awk '{print $NF}'`


Ça ne marche que si le dernier élément ne contient pas de blancs
et qu'aucun argument ne contient de backslashes.

Exemples qui foirent :

./script.sh a b "c c"
./script.sh a b "c
c"
./script.sh 'ana' 'bnb' c

--
Stéphane ["Stephane.Chazelas" arobase "free.fr"]

Avatar
Tux
Stephane Chazelas wrote:

2003/10/26, 22:01(+00), Tux:
[...]
dernier=${@: -1}

En général j'utilise ${!#}


c'est portable ou spécifique à bash ?


Meme niveau de portabilité que ${@: -1}: bash2 et ksh93.

Avec zsh, ça serait ${(P)#}

eval dernier=$$#

marche avec tous les shells Bourne-like.

OK, merci




Avatar
MrBuG
Finalement j'ai choisi d'adopter la solution de Stephane (eval "dernier $$#") qui correspond complètement à mes attentes.

Merci à tous de m'avoir aider.
--
Mr. Bug
Avatar
William
On Sun, 26 Oct 2003 23:16:06 +0100, Stephane Chazelas wrote:

2003/10/26, 20:33(+01), William:
[...]
#!/bin/sh
last_argument=`echo $@|awk '{print $NF}'`


Ça ne marche que si le dernier élément ne contient pas de blancs et
qu'aucun argument ne contient de backslashes.


en effet, mea culpa

--
William.