Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 08/03/2011, à 10:05

YannUbuntu

Optimisation code bash du Desinstallateur d'OS

Bonjour

J'ai besoin de votre aide pour optimiser le code du Desinstallateur d'OSsmile
J'ai un fichier de type :

/dev/sda1:Windows Vista (loader):Windows:chain
/dev/sda5:Ubuntu 10.04.1 LTS (10.04):Ubuntu:linux
/dev/sdb10:Ubuntu 10.10 (10.10):Ubuntu:linux
...

et je voudrais, pour chaque ligne, mettre en variable les éléments suivants :
PARTITION[ligne1]="sda1"   (apres le dev/ , et avant les deux points )
DISK[ligne1]="sda"
NAME1[ligne1]="Windows Vista (loader):Windows:chain" (tout ce qu'il y a après les deux points)
NAME2[ligne1]="Windows Vista"  (avant la première ouverture de parenthèse, mais sans l'espace avant cette parenthèse)
NAME3[ligne1]="Windows"  (le 1er mot avant le 1er espace)

Comment feriez-vous cela ?


à consulter/améliorer: Guide du Débutant, Logiciels, Ecole, Travail, Maison

Hors ligne

#2 Le 08/03/2011, à 10:34

Hizoka

Re : Optimisation code bash du Desinstallateur d'OS

a="/dev/sda1:Windows Vista (loader):Windows:chain"
PARTITION=${a##*/} PARTITION=${PARTITION%%:*}
DISK=${PARTITION/%[0-9]*}
NAME1=${a#*:} NAME1=${NAME1%%:*}
NAME2=${NAME1% *}
NAME3=${NAME1%% *}
echo "PARTITION : $PARTITION
DISK : $DISK
NAME1 : $NAME1
NAME2 : $NAME2
NAME3 : $NAME3"

=>

PARTITION : sda1
DISK : sda
NAME1 : Windows Vista (loader)
NAME2 : Windows Vista
NAME3 : Windows

si tu utilises un treeview avec glade2script, tu pourras tout séparer également...

Dernière modification par Hizoka (Le 08/03/2011, à 10:38)


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#3 Le 08/03/2011, à 10:43

YannUbuntu

Re : Optimisation code bash du Desinstallateur d'OS

merci smile et comment fais-tu la boucle pour scanner le fichier ligne par ligne ?
( j'utilise actuellement un for i in fichier , mais ca me prend bout par bout entre les espace, par exemple :
/dev/sda1:Windows ,
puis Vista
puis (loader):Windows:chain


à consulter/améliorer: Guide du Débutant, Logiciels, Ecole, Travail, Maison

Hors ligne

#4 Le 08/03/2011, à 10:48

Hizoka

Re : Optimisation code bash du Desinstallateur d'OS

while read ligne
do
....
done < ta_liste

ou

while read ligne
do
....
done < <(ta commande qui renvoie les lignes)

ou encore for avec modif de l'IFS mais bof...

old_IFS=${IFS}
IFS=$'\n'
for i in ....
do
....
done
IFS=${old_IFS}

Dernière modification par Hizoka (Le 08/03/2011, à 10:49)


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#5 Le 08/03/2011, à 13:56

YannUbuntu

Re : Optimisation code bash du Desinstallateur d'OS

Splendide, merci ! big_smile


à consulter/améliorer: Guide du Débutant, Logiciels, Ecole, Travail, Maison

Hors ligne

#6 Le 08/03/2011, à 15:11

YannUbuntu

Re : Optimisation code bash du Desinstallateur d'OS

Bingo ! je passe de 40 lignes à 10 lignes de code lol


à consulter/améliorer: Guide du Débutant, Logiciels, Ecole, Travail, Maison

Hors ligne

#7 Le 08/03/2011, à 23:04

Hizoka

Re : Optimisation code bash du Desinstallateur d'OS

d'autres questions ?


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#8 Le 09/03/2011, à 03:52

YannUbuntu

Re : Optimisation code bash du Desinstallateur d'OS

oui, mais ca devient du détail :

1) optimiser les codes suivants : (peut-etre avec des <<< ?)

$(sudo blkid | grep -i '="ntfs"' | cut -c6-9)
$(echo $TAB | xargs zenity --list --title="$os_uninstaller" --text="$Which_os_do_you_want_to_uninstall" --column="")
$(dir $TMP_FOLDER/${DISK[$m]} | grep -i "mbr-")

2) Regarder dans le code si je peux retirer des guillemets sans risque, par exemple pour les codes du type :

zenity --info --title="$Operation_aborted"
if [[ "$ADVISE_BOOTLOADER_UPDATE" = "yes" ]]; then

Dernière modification par YannUbuntu (Le 09/03/2011, à 03:53)


à consulter/améliorer: Guide du Débutant, Logiciels, Ecole, Travail, Maison

Hors ligne

#9 Le 09/03/2011, à 04:26

Hizoka

Re : Optimisation code bash du Desinstallateur d'OS

$(sudo blkid | grep -i '="ntfs"' | cut -c6-9)
$(sudo blkid | sed -n '/="ntfs"/ s@.*/\(.*\): .*@\1@p')
$(echo $TAB | xargs zenity --list --title="$os_uninstaller" --text="$Which_os_do_you_want_to_uninstall" --column="")
$(xargs zenity --list --title="$os_uninstaller" --text="$Which_os_do_you_want_to_uninstall" --column="" <<< "$TAB")

xargs sert à quoi ?

$(dir $TMP_FOLDER/${DISK[$m]} | grep -i "mbr-")
$(ls  $TMP_FOLDER/${DISK[$m]}/*mbr-*
zenity --info --title="$Operation_aborted"

Conserve les, ca ne coute rien et ca evite tout probleme

if [[ "$ADVISE_BOOTLOADER_UPDATE" = "yes" ]]; then
if [[ ${ADVISE_BOOTLOADER_UPDATE} == yes ]]; then

Teste tous les codes 1 à 1...


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#10 Le 09/03/2011, à 04:47

YannUbuntu

Re : Optimisation code bash du Desinstallateur d'OS

$(sudo blkid | sed -n '/="ntfs"/ s@.*/\(.*\): .*@\1@p')
-> Trop compliqué pour moi, je ne saurais pas retrouver le sens .. wink
Pas moyen d'utiliser 2 fois <<<   ?

$(xargs zenity --list --title="$os_uninstaller" --text="$Which_os_do_you_want_to_uninstall" --column="" <<< "$TAB")
-> ok, c'est bien ce que je pensais, mais je me demandais s'il fallait mettre des parentheses avant les  <<<
Cette construction avec xargs permet de remplir la liste du zenity. Par contre je ne connais pas son fonctionnement interne, j'applique juste la recette.

$(ls  $TMP_FOLDER/${DISK[$m]}/*mbr-*
-> je suppose qu'il manque la fermeture de parenthese wink Pourquoi ls au lieu de dir ?

Conserve les, ca ne coute rien et ca evite tout probleme. -> parce-que dans zenity ? quid d'une structure sans zenity du type :

VARIABLE="$Operation_aborted"

Dans ce cas je peux retirer les guillemets ?

if [[ ${ADVISE_BOOTLOADER_UPDATE} == yes ]]; then
quelle es la difference entre = et == ? (il me semble avoir deja vu un exemple avec un seul = , et sans guillemets .. )

Dernière modification par YannUbuntu (Le 09/03/2011, à 04:52)


à consulter/améliorer: Guide du Débutant, Logiciels, Ecole, Travail, Maison

Hors ligne

#11 Le 09/03/2011, à 04:58

YannUbuntu

Re : Optimisation code bash du Desinstallateur d'OS

ah autre question : comment ouvrir un fichier FILE="/dossier/fichier" et y inserer une ligne de code $CODE="ma ligne de code" a un numero de ligne donné ($NUM_LIGNE) ?


à consulter/améliorer: Guide du Débutant, Logiciels, Ecole, Travail, Maison

Hors ligne

#12 Le 09/03/2011, à 06:29

Hizoka

Re : Optimisation code bash du Desinstallateur d'OS

$(sudo blkid | sed -n '/="ntfs"/ s@.*/\(.*\): .*@\1@p')
-> Trop compliqué pour moi, je ne saurais pas retrouver le sens ..
Pas moyen d'utiliser 2 fois <<<   ?

Non...
-n : n'affichera que les lignes demandées
/="ntfs"/ : recherche les lignes contenant ="ntfs" (équivalent à ton grep)
s : remplace  .*/\(.*\): .* par \1
@ : le délimiteur qu'on utilisera pour sed
.*/\(.*\): . : tout jusqu'au /, conserve en mémoire ce qui suit jusqu'à ": "
:\1 :ce que tu gardé en mémoire (le \(.*\))
p : affiche le retour de ma recherche et modification.

$(xargs zenity --list --title="$os_uninstaller" --text="$Which_os_do_you_want_to_uninstall" --column="" <<< "$TAB")

et sans le xargs ça passe pas ?

$(ls  $TMP_FOLDER/${DISK[$m]}/*mbr-*
-> je suppose qu'il manque la fermeture de parenthese  Pourquoi ls au lieu de dir ?

en effet il manque la parenthèse. j'utilise ls afin de ne pas utiliser de | et donc optimiser le code.

Conserve les, ca ne coute rien et ca evite tout probleme. -> parce-que dans zenity ?
Tu as besoin des " ou ' si tu as un texte à espace.

quid d'une structure sans zenity du type :
VARIABLE="$Operation_aborted"
Dans ce cas je peux retirer les guillemets ?

a="j'aime le gros rouge qui pique"
echo ${a}
=> j'aime le gros rouge qui pique
zenity --info --title=$a
=> zenity --info --title=j'aime le gros rouge qui pique

conclusion...ca passe pas...
il te faut l'encadrer de "

if [[ ${ADVISE_BOOTLOADER_UPDATE} == yes ]]; then
quelle es la difference entre = et == ? (il me semble avoir deja vu un exemple avec un seul = , et sans guillemets .. )

tu n'as pas du lire : http://abs.traduc.org/abs-fr/ch07s03.html

ah autre question : comment ouvrir un fichier FILE="/dossier/fichier" et y inserer une ligne de code $CODE="ma ligne de code" a un numero de ligne donné ($NUM_LIGNE) ?

echo "a : 1
b : 2
d : 4
e : 5" > test
sed -i "2ac : 3" test
cat test
=> a : 1
b : 2
c : 3
d : 4
e : 5
rm test

-i : modifie directement le fichier
2 : ligne numero 2
a : ajoute apres la ligne 2
c : 3 : texte à ajouter
test : nom du fichier
donc la réponse à ta question :

sed -i "${NUM_LIGNE}a${CODE}" "${FILE}"

Répétition de conseil : encadre tes variables par des accolades...

Dernière modification par Hizoka (Le 09/03/2011, à 06:30)


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne