107 votes

Les expressions d'extension de paramètre ${var} peuvent-elles être imbriquées dans bash ?

Voici ce que j'ai :

progname=${0%.*}
progname=${progname##*/}

Cela peut-il être imbriqué (ou non) dans une seule ligne, c'est-à-dire une seule expression ?

J'essaie de supprimer le chemin et l'extension d'un nom de script pour qu'il ne reste que le nom de base. Les deux lignes ci-dessus fonctionnent bien. Ma nature en « C » me pousse simplement à les obscurcir encore plus.

87voto

user1956358 Points 41

Bash prend en charge l'expansion indirecte :

$ FOO_BAR="foobar"
$ foo=FOO
$ foobar=${foo}_BAR
$ echo ${foobar}
FOO_BAR
$ echo ${!foobar}
foobar

Cela devrait prendre en charge l'imbrication que vous recherchez.

74voto

Tim Points 33042

Si par nid, vous voulez dire quelque chose comme ceci :

#!/bin/bash

export HELLO="HELLO"
export HELLOWORLD="Hello, world!"

echo ${${HELLO}WORLD}

Alors non, vous ne pouvez pas imbriquer les expressions ${var}. L'extenseur de syntaxe bash ne le comprendra pas.

Cependant, si je comprends bien votre problème, vous pouvez regarder à l'aide de la commande basename - il supprime le chemin d'un nom de fichier donné, et si donné l'extension, dépouillera cela aussi. Par exemple, exécuter basename /some/path/to/script.sh .sh renverra script.

26voto

luferbraho Points 217

L'option suivante a fonctionné pour moi :

NAME="par1-par2-par3"
echo $(TMP=${NAME%-*};echo ${TMP##*-})

La sortie est :

par2

19voto

Deepak Points 1

Un vieux fil mais peut-être la réponse est l'utilisation de l'Indirection :$ { !PARAMÈTRE}

Par exemple, considérez les lignes suivantes :

H="abc"
PARAM="H"
echo ${!PARAM} #gives abc

14voto

Nathan Kitchen Points 2729

Cette imbrication ne semble pas possible en bash, mais elle fonctionne en zsh :

progname=${${0%.*}##*/}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X