!/bin/bash # récupération des arguments arg_mode="$1" arg_fichier="$2" declare -a expression i=0 while [ "$3" != "" ]; do expression[i]="$3" i=$[i+1] shift done base='/etc/portage/package.' usage() { echo "\ usage: $0 mode: -a: ajouter un élément au fichier -r: retirer un élément au fichier -s: chercher un élément dans le fichier fichier: au choix: keywords, use, mask ou unmask expression: l'expression doit être consitituée au minimum de l'atom concerné. Si le fichier est keywords, un type de masque peut être spécifié, faute de quoi ~x86 est choisi par défaut. Si le fichier est use, les use a enlever ou ajouter doivent être spécifier à la suite de l'atome. exemples: $0 -r keywords dev-lang/python $0 -a mask app-editors/emacs $0 -a use dev-lang/ruby threads doc -tcltk $0 -r use app-editor/vim vim-with-x $0 -s use $0 -s use x11-terms/rxvt-unicode " } # traitement des arguments arg_parse() { case $arg_mode in "-a" ) mode="ajouter" ;; "-r" ) mode="retirer" ;; "-s" ) mode="voir" ;; * ) usage; exit;; esac if [ "$arg_fichier" == "keywords" ] || [ "$arg_fichier" == "use" ] || [ "$arg_fichier" == "mask" ] || [ "$arg_fichier" == "unmask" ]; then fichier="$arg_fichier" else usage exit fi } ajouter() { echo $1 >> $base$fichier echo "ajout effectué" exit } retirer() { f_tmp="/dev/shm/$fichier" cp $base$fichier $f_tmp cp $base$fichier $base$fichier"~" atom_preserv="$(echo $atom |sed 's/\//\\\//')" # il faut échapper le '/' dans le nom des atoms if [ "$fichier" == "use" ] && [ "${tab_uses[0]}" != "" ]; then i=0 while [ "${tab_uses[$i]}" != "" ]; do awk '/'$atom_preserv'/ {sub(/ '${tab_uses[$i]}'/, "")}; {print}' $base$fichier > $f_tmp mv $f_tmp $base$fichier # on supprime toute la ligne s'il n'y a plus de use spécifié dedans un_use="$(awk '/'$atom_preserv'/ {print $2}' $base$fichier)" if [ "$un_use" == "" ]; then tab_uses[0]=""; retirer; fi i=$[$i+1] done else awk '$0 !~ "'$atom_preserv'"' $base$fichier > $f_tmp 2>&1 mv $f_tmp $base$fichier fi echo -e "atom(s) modifié(s):\n" "$(cat $base$fichier"~" | grep $atom | cut -d ' ' -f 1)" exit } exist?() { # on quitte en cas de demande incohérente resultat="$(cat $base$fichier | grep $atom)" if [ "$fichier" != "use" ] && [ "$mode" == "ajouter" ] && [ "$resultat" != "" ]; then echo "cet atom est déjà présent dans $base$fichier" exit fi if [ "$mode" == "retirer" ] && [ "$resultat" == "" ]; then echo "cet atom n'est pas présent dans $base$fichier" exit fi } voir(){ if [ "$atom" != "" ]; then recherche="$(cat $base$fichier | grep $atom)" recherche="$(awk '/'$atom'/ ' $base$fichier | grep $atom)" reg_atom="$(echo $atom | sed 's/^/\//')" reg_atom="$(echo $reg_atom | sed 's/$/\//')" else recherche="$(cat $base$fichier)" fi if [ "$recherche" == "" ]; then echo "cet atom n'est pas présent dans $base$fichier" else awk ''$reg_atom' { texte="\033[33m" $1 i=2 while ( i <= NF ) { if ( $i ~ /^-/ ) { texte=texte" \033[34m" } else { texte=texte" \033[31m" } texte=texte$i i++ } print texte }' $base$fichier 2>&1 fi } # main arg_parse atom=${expression[0]} case $fichier in "keywords" ) if [ "${expression[1]}" != "" ]; then keyword=${expression[1]}; else keyword="~x86"; fi # par défaut, le keyword est ~x86 case $mode in "ajouter" ) exist?; ajouter "$atom $keyword";; "retirer" ) exist?; retirer;; "voir" ) voir;; esac;; "mask" | "unmask" ) case $mode in "ajouter" ) exist?; ajouter $atom;; "retirer" ) exist?; retirer;; "voir" ) voir;; esac ;; "use" ) declare -a tab_uses i=1 while [ "${expression[$i]}" != "" ]; do tab_uses[$i-1]="${expression[$i]}"; i=$[$i+1]; done case $mode in "ajouter" ) exist? if [ "$resultat" == "" ]; then ajouter "$atom ${tab_uses[*]}" else echo -e "atom(s) modifié(s):" j=0 nbr_lignes=$(echo -e "$resultat" | wc -l) for (( j=1; j <= nbr_lignes; j++ )); do i=0 cp $base$fichier $base$fichier"~" atom_tmp="$(echo -e "$resultat" | head -n $j | tail -n 1)" while [ "${tab_uses[$i]}" != "" ]; do resultat_preserv="$(echo -e "$atom_tmp" |sed 's/\//\\\//')" sed -i 's/'"$resultat_preserv"'/'"$resultat_preserv"' '${tab_uses[$i]}'/' $base$fichier i=$[$i+1] done echo -e "$atom_tmp" | cut -d ' ' -f 1 done fi ;; "retirer" ) exist?; retirer;; "voir" ) voir ;; esac;; esac