Jump to content

[BASH] Execution d'une commande dans une variable


Recommended Posts

Bonjour à tous.

Je rencontre un problème avec une fonction BASH dont voici le code :

function dateformat {

typeset -i RESULT=255

FORMAT=${1:-''}

COMMAND="/usr/local/bin/date +$FORMAT"
THE_DATE=`$COMMAND`
RESULT=${?}

if [[ ${RESULT} -ne 0 ]]; then

	echo -e "In file ${BASH_SOURCE} at line ${LINENO}: Failed to format date using command '${COMMAND}'."

else

	echo "${THE_DATE}"

fi

return ${RESULT}

}

J'exécute ensuite la fonction via ces deux lignes :

dateformat '%Y'

dateformat '%Y %d'

Dans le 1er cas, ca fonctionne correctement. Par contre dans le 2ème cas, le %d après l'espace est interpréré comme étant un second argument...

J'ai également testé avec l'appel suivant :

dateformat "'%Y %d'"

Sans succès... Y-a-t'il quelq'un pour m'aider ?

Merci bien :keskidit:

Link to comment
Share on other sites

Et si tu utilises dans ton script $@ ou $* ca n'irait pas mieux?

J'avoue que je ne sais plus lequel est celui qui donne tous les arguments mais je crois que c'est $*

Merci, je vais tester.

La différence entre $@ et $* est subtile : Si tu fait "$*" tu as une string contenant tous les parametres d'une fonction (ou d'un script), espacée du premier caractère de la variable d'environement $IFS et entourée du caractère ". Tandis que "$@" te donne n strings entourées du caractère ", avec n étant le nombre de paramètres de la fonction / script.

Link to comment
Share on other sites

Arf, ça ne fonctionne pas mieux. Vois les traces de debug :

+ DATE=/usr/local/bin/date
+ dateformat '%Y %d'
+ typeset -i RESULT=255
+ FORMAT='%Y %d'
+ COMMAND='/usr/local/bin/date +%Y %d'
++ /usr/local/bin/date +%Y %d
/usr/local/bin/date: extra operand `%d'
Try `/usr/local/bin/date --help' for more information.
+ THE_DATE=
+ RESULT=1
+ [[ 1 -ne 0 ]]
+ echo 'In file ./main.bash at line 42: Failed to format date using command '\''/usr/local/bin/date +%Y %d'\''.'
In file ./main.bash at line 42: Failed to format date using command '/usr/local/bin/date +%Y %d'.
+ return 1
+ exit

Celle là c'est quand j'appelle la fonction avec le parametre '%Y %d'

+ DATE=/usr/local/bin/date
+ dateformat ''\''%Y %d'\'''
+ typeset -i RESULT=255
+ FORMAT=''\''%Y %d'\'''
+ COMMAND='/usr/local/bin/date +'\''%Y %d'\'''
++ /usr/local/bin/date '+'\''%Y' '%d'\'''
/usr/local/bin/date: extra operand `%d\''
Try `/usr/local/bin/date --help' for more information.
+ THE_DATE=
+ RESULT=1
+ [[ 1 -ne 0 ]]
+ echo 'In file ./main.bash at line 42: Failed to format date using command '\''/usr/local/bin/date +'\''%Y %d'\'''\''.'
In file ./main.bash at line 42: Failed to format date using command '/usr/local/bin/date +'%Y %d''.
+ return 1
+ exit

Et là c'est quand j'appelle la fonction avec le parametre "'%Y %d'"

En fait dans le premier cas, on vois bien que l'espace du paramètres est interprété comme un second paramètre. Et dans le 2ème cas, les ' utilisées pour regrouper les deux parties du paramètre sont "echapées" donc non interprétées. Vraiment étrange...

Link to comment
Share on other sites

Bonjour à tous.

Je rencontre un problème avec une fonction BASH dont voici le code :

	FORMAT=${1:-''}

COMMAND="/usr/local/bin/date +$FORMAT"
THE_DATE=`$COMMAND`

Ça fonctionne en remplaçant par ça :

  RESULT=`/usr/local/bin/date +"$1"`

Pourquoi, je n'en sais rien exactement. Possible que ce soit à cause des imbrications de quotes.

++ /bin/date '+%Y %d'
++ /bin/date '+"%Y' '%d"'

On voit bien la différence.

Hors sujet : Tu l'as recompilé ton date ?

Link to comment
Share on other sites

Merci pour ta réponse.

En fait je souhaite avoir une variable pour stocker une commande pour pouvoir soit l'afficher, soit l'exécuter. Je souhaite utiliser une variable afin d'eviter d'avoir deux fois la commande car ça veux dire pense à modifier les deux endrois lors d'une mise à jour -> 99% de chance d'oublier...

Note: Je n'ai pas recompilé date, je travaille sous Solaris 8 sur lequel est installé les outils GNU dans /usr/local/bin en plus des outils POSIX Unix dans /usr/xpg4/bin. Comme je souhaite assurer la portabiliter vers Linux j'utilise les outils GNU (qui offrent par ailleurs bien plus de possibilitées)

Link to comment
Share on other sites

J'ai trouvés un moyen de contournement. C'est pas très joli, mais ça fonctionne.

En fait je replace les espaces du format de la date par l'equivalent en héxa. Cette valeur n'est ensuite interprétée que par la commande echo et pas par par la commande date.

dateformat '%Y\x20%d'

PS: Bien sûr il ne faut pas non plus oublier de spécifier le paramètre -e à la commande echo, sinon le caractère l'echapement \x n'est pas interprété...

Link to comment
Share on other sites

Note: Je n'ai pas recompilé date, je travaille sous Solaris 8 sur lequel est installé les outils GNU dans /usr/local/bin en plus des outils POSIX Unix dans /usr/xpg4/bin. Comme je souhaite assurer la portabiliter vers Linux j'utilise les outils GNU (qui offrent par ailleurs bien plus de possibilitées)
Tu m'étonnes...

Plus il y a de gnu, moins on est emmerdé :yes:

Moi aussi je met plein de gnu sur les solaris :smack:

J'ai trouvés un moyen de contournement. C'est pas très joli, mais ça fonctionne.

En fait je replace les espaces du format de la date par l'equivalent en héxa. Cette valeur n'est ensuite interprétée que par la commande echo et pas par par la commande date.

dateformat '%Y\x20%d'

PS: Bien sûr il ne faut pas non plus oublier de spécifier le paramètre -e à la commande echo, sinon le caractère l'echapement \x n'est pas interprété...

Pas bête.

Dans ce cas puis-je te suggérer un

FORMAT=$(echo ${1:-''} | sed 's/ /\\x20/g')

Histoire de ne pas avoir à le faire pour chaque appel.

EDIT : copier coller.

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...