Recuperer les attributs k,K,m,M,g,G

[Résolu/Fermé]
Signaler
Messages postés
8
Date d'inscription
mercredi 16 juillet 2008
Statut
Membre
Dernière intervention
12 mars 2009
-
Messages postés
8
Date d'inscription
mercredi 16 juillet 2008
Statut
Membre
Dernière intervention
12 mars 2009
-
Bonjour,


J'ai un petit probleme sous Unix

Je suis actuellement en train de developper une appli qui sert a creer une partition sur un disque dut

le but est donc d'automatiser et que je puisse balancer la taille de la partoche dans les attributs de la fonction

Seulement, voila, je me vois mal rentrer la taille en octets (surtout si c'est de plusieurs GiB)

mon but est donc que quand je tape le nom de mon bash avec (par exemple) 1024K, que derrierer je puisse recuperer une variable qui fait 1024*1024

j'ai commencé a me pencher sur la question mais je m'arrache les cheveux:

ce que j'ai fait: (la taille est le 3eme argument de ma commande

if ( `echo "$3" | grep "K"`= "$3")
then
...
#j'ai pas encore trouvé comment enlever le dernier caractere mais bon un pb apres l'autre

et puis apres des elifs pour M et G (la ligne sera la meme a un caractere pres)

par exemple quand $3 vaut 1024K, quand je grep $3, il me renvoit 1024K puisque qu'il renvoit toute la ligne...

seulement non seulement je n'entre jamais dans la boucle mais en plus il me fait un e erreur de "token"

NEED HELP

4 réponses

Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 872
Salut,

Attention : Pas d'espace entre les 2 crochets ouvrants de "[ [:digit:]]", dans l'exemple ci-dessous l'espace n'est là que pour palier à une interprétation interne des doubles crochets ;-(((
[tmpfs]$ cat foo.sh
#! /bin/bash

case "${3//[ [:digit:]]/}" in
K|k)    var=$(( ${3/[Kk]/}*1024 ))
        ;;
M|m)    var=$(( ${3/[Mm]/}*1024*1024 ))
        ;;
G|g)    var=$(( ${3/[Gg]/}*1024*1024*1024 ))
        ;;
esac

echo $var

[tmpfs]$ ./foo.sh 1024 1024 1024K
1048576

[tmpfs]$ ./foo.sh 1024 1024 1024k
1048576

[tmpfs]$ ./foo.sh 1024 1024 1024g
1099511627776

[tmpfs]$
;-))
Messages postés
8
Date d'inscription
mercredi 16 juillet 2008
Statut
Membre
Dernière intervention
12 mars 2009

heu ... chez moi ca ne marche pas...

j'ai un message d'erreur...

~ # sh ./finalbench.sh -HDD -EXT2 128K
Vous etes l'user root
Valid param numbers
80023749120
finalbench.sh: line 174: syntax error: Bad substitution

La ligne en question (174) est la ligne ou se trouve le case (le test d'entrée du switch).

Aussi quand je fait sortir la ligne de calcul de la boucle:
ASKED_SIZE=$(( ${3/[Kk]/}*1024 ))

il me dis aussi une erreur de substitution...
Peut etre qu'il faut que je charge des modules supplementaires dans ma distribution (mais ca m'arrangerai pas)

J'avais lu un truc sur les sed (il y a quelques années de ca) et normalement, on peut faire ce genre de trucs en combinant un peu de sed et un peu de awk ...

Mais j'ai pas trouvé encore l'astuce...

Mais bon ... si ca marche chez toi, tu pourra pas facilement trouver d'ou vien le probleme...
Messages postés
8
Date d'inscription
mercredi 16 juillet 2008
Statut
Membre
Dernière intervention
12 mars 2009

Le truc c'est que je travaille avec une distribution super light et toutes les fonctions ne sont pas presentes

j'avais pensé a recuperer la longeur de ma taille
 SIZE_SIZE= length $3 


et ensuite de faire des test sur le SIZE_SIZE ieme caractere...

mais pareil, je ne sais pas comment extraire un caractere a partir de sa place dans le string
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 872
Exécute les commandes en mode de débogage (set -xv)
Quelle version de bash ( bash --version) ?
As-tu essayé mon exemple seul ?
Messages postés
8
Date d'inscription
mercredi 16 juillet 2008
Statut
Membre
Dernière intervention
12 mars 2009

j'ai essayé ton bout de code sur ma machine Ubuntu (machine virtuelle sur VMWARE) ca compile pas
Pas plus que sur mon embedded.
Merci tout de meme du temps que tu as pris pour faire ca.

J'ai fait une solution, qui marche mais qui est un peu bourin quand meme...

la voila

###
# INTERPRETATION DES ATRIBUTS K M ET G (et aussi k, m et g)
###
ARG3=$3
SIZE=${#ARG3}
case $SIZE in
2) LETTER=`echo $3 | awk -F "" '{ print $2 }'` NUMBER=`echo $3 | awk -F "" '{ print $1 }'`;;
3) LETTER=`echo $3 | awk -F "" '{ print $3 }'` NUMBER=`echo $3 | awk -F "" '{ print $1$2 }'`;;
4) LETTER=`echo $3 | awk -F "" '{ print $4 }'` NUMBER=`echo $3 | awk -F "" '{ print $1$2$3 }'`;;
5) LETTER=`echo $3 | awk -F "" '{ print $5 }'` NUMBER=`echo $3 | awk -F "" '{ print $1$2$3$4 }'`;;
6) LETTER=`echo $3 | awk -F "" '{ print $6 }'` NUMBER=`echo $3 | awk -F "" '{ print $1$2$3$4$5 }'`;;
*) echo "Veuillez specifier la taille dans un format mieux adapte"
esac
case "$LETTER" in
K|k)   ASKED_SIZE=$((1024 * $NUMBER)) ;;
M|m)   ASKED_SIZE=$(($NUMBER * 1024 * 1024)) ;;
G|g)   ASKED_SIZE=$(($NUMBER * 1024 * 1024 * 1024)) ;;
[0-9]) ASKED_SIZE=$(($ARG3)) ;;
*) echo 'HOUSTON, ON A UN PROBLEME'
   echo "Je sais pas trop ce que c'est comme taille $LETTER ;)"
        exit; ;;
esac



J'avais prevenu que c'etais bourin...