Advertisement
sebbu

pathmod

Feb 6th, 2012
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 7.81 KB | None | 0 0
  1. #!/bin/bash
  2. ## add :
  3. ## export BASHPID=$$
  4. ## to ~/.bashrc if bash < 4.0-alpha
  5.  
  6. #fonction pour quitter correctement, peu importe le mode d'appel (source ou non)
  7. function quitter() {
  8.     # $BASHPID est le pid de la console bash
  9.     # $$ est le pid du processus courant
  10.     # $BASH_SUBSHELL vaux 0 si on est dans la console bash
  11.     if [ $BASHPID -eq $$ ]
  12.     #if [ $BASH_SUBSHELL -eq 0 ]
  13.     then
  14.         return
  15.     else
  16.         exit 1
  17.     fi
  18. }
  19.  
  20. #variables
  21.  
  22. #mode debug, 0 = off, 1 = on
  23. #debug mode means it should be run as a separate process
  24. #normal mode means it should be run as same process, with . path/file
  25. DEBUG=1
  26. #contenu de la ligne retournée par READ
  27. REPLY=''
  28. #code de retour de read (0 si normal, 1 si EOF)
  29. ret=0
  30.  
  31. #afficher path
  32. echo -e "\e[31mPATH=\e[0m"
  33. echo $PATH
  34.  
  35. #vérifier mode d'appel
  36. if [ $DEBUG -eq 1 ]
  37. then
  38.     if [ $BASHPID -eq $$ ]
  39.     #if [ $BASH_SUBSHELL -eq 0 ]
  40.     then
  41.         echo -e '\e[1;31mERROR : launch with ./pathmod.sh while in DEBUG MODE\e[0m'
  42.         quitter;
  43.     fi
  44. elif [ $DEBUG -eq 0 ]
  45. then
  46.     if [ $BASHPID -ne $$ ]
  47.     #if [ $BASH_SUBSHELL -eq 0 ]
  48.     then
  49.         echo -e '\e[1;31mERROR : launch with . ./pathmod.sh OR source ./pathmod.sh\e[0m'
  50.         quitter;
  51.     fi
  52. else
  53.     echo -e '\e[1;31mERROR : invalide DEBUG value\e[0m'
  54.     quitter;
  55. fi
  56.  
  57. #sauvegarde l'ancienne valeur du séparateur de champ
  58. IFS_OLD=$IFS
  59. #séparateur de champ
  60. IFS=':'
  61. export IFS
  62. #création d'un tableau
  63. declare -a dirs=($PATH)
  64. dirsize=${#dirs[@]}
  65.  
  66. #vérifie nombre de dossier : ERREUR si == 1 et PATH contient :
  67. if [ ${#dirs[@]} -eq 1 -a `expr index "$PATH" ':'` -ne 0 ]
  68. then
  69.     echo $dirs
  70.     echo -e "\e[1;31mERROR : 1 element only\e[0m"
  71.     quitter;
  72. fi
  73.  
  74. #affiche la liste des dossiers
  75. function dirs_show() {
  76.     echo -e "\e[32mDIRS=\e[0m"
  77.     echo "Number of items in original array: ${#dirs[@]}"
  78.     for i in ${!dirs[@]}
  79.     do
  80.         printf "%4d = %s\n" $i ${dirs[$i]}
  81.     done
  82. }
  83. dirs_show
  84. echo ''
  85.  
  86. #menu
  87. while true
  88. do
  89.     echo -e "\e[34mChoix\e[0m de l'opération à éffectuer [help pour l'aide]"
  90.     read -e
  91.     ret=$?
  92.     #quitter la boucle
  93.     if [ $ret -eq 1 ]
  94.     then
  95.         break;
  96.     elif [ "$REPLY" == "quit" -o "$REPLY" == "exit" ]
  97.     then
  98.         break
  99.     elif [ "$REPLY" == "show" ]
  100.     then
  101.         dirs_show
  102.     #ajouter un dossier avant un dossier existant (2 args)
  103.     elif [ "${REPLY%% *}" == "add_before" ]
  104.     then
  105.         id1=`expr index "$REPLY" ' '`
  106.         string=${REPLY#* }
  107.         id2=`expr index "$string" ' '`
  108.         idx=${string%% *}
  109.         string=${string#* }
  110.         if [ $id1 -eq 0 -o $id2 -eq 0 ]
  111.         then
  112.             echo -e "\e[1;31mERROR : incorrect number of arguments\e[0m"
  113.             echo '' #blank line skipped because of continue
  114.             continue
  115.         fi
  116.         IFS=
  117.         #vérifier s'il y a rien avant
  118.         if [ $idx -eq 0 ]
  119.         then
  120.             dirs=( "$string" ${dirs[@]} )
  121.         else
  122.             dirs=( ${dirs[@]:0:$idx-1} "$string" ${dirs[@]:$idx} )
  123.         fi
  124.         IFS=:
  125.         dirsize=${#dirs[@]}
  126.     #ajouter un dossier après un dossier existant (2 args)
  127.     elif [ "${REPLY%% *}" == "add_after" ]
  128.     then
  129.         id1=`expr index "$REPLY" ' '`
  130.         string=${REPLY#* }
  131.         id2=`expr index "$string" ' '`
  132.         idx=${string%% *}
  133.         string=${string#* }
  134.         if [ $id1 -eq 0 -o $id2 -eq 0 ]
  135.         then
  136.             echo -e "\e[1;31mERROR : incorrect number of arguments\e[0m"
  137.             echo '' #blank line skipped because of continue
  138.             continue
  139.         fi
  140.         IFS=
  141.         #vérifier s'il y a rien après
  142.         if [ $idx -eq ${#dirs} ]
  143.         then
  144.             dirs=( ${dirs[@]:0:$idx+1} "$string" )
  145.         else
  146.             dirs=( ${dirs[@]:0:$idx+1} "$string" ${dirs[@]:$idx+1} )
  147.         fi
  148.         IFS=:
  149.         dirsize=${#dirs[@]}
  150.     #supprime un dossier
  151.     elif [ "${REPLY%% *}" == "delete" ]
  152.     then
  153.         id1=`expr index "$REPLY" ' '`
  154.         idx=${REPLY#* }
  155.         id2=`expr index "$idx" ' '`
  156.         if [ $id1 -eq 0 -o $id2 -ne 0 ]
  157.         then
  158.             echo -e "\e[1;31mERROR : incorrect number of arguments\e[0m"
  159.             echo '' #blank line skipped because of continue
  160.             continue
  161.         fi
  162.         IFS=
  163.         #vérifier qu'il y a rien avant
  164.         if [ $idx -eq 0 ]
  165.         then
  166.             dirs=${dirs[@]:1}
  167.         else
  168.             #vérifier qu'il y a rien après
  169.             if [ $idx -eq ${#dirs} ]
  170.             then
  171.                 dirs=( ${dirs[@]:0:$idx} )
  172.             else
  173.                 dirs=( ${dirs[@]:0:$idx} ${dirs[@]:$idx+1} )
  174.             fi
  175.         fi
  176.         IFS=:
  177.         dirsize=${#dirs[@]}
  178.     #déplace un dossier d'une ou plusieurs position vers le haut
  179.     elif [ "${REPLY%% *}" == "moveup" ]
  180.     then
  181.         id1=`expr index "$REPLY" ' '`
  182.         string=${REPLY#* }
  183.         id2=`expr index "$string" ' '`
  184.         idx=${string%% *}
  185.         pos=${string#* }
  186.         id3=`expr index "$pos" ' '`
  187.         if [ $id1 -eq 0 -o $id2 -eq 0 -o $id3 -ne 0 ]
  188.         then
  189.             echo -e "\e[1;31mERROR : incorrect number of arguments\e[0m"
  190.             echo '' #blank line skipped because of continue
  191.             continue
  192.         fi
  193.         if [ $idx -lt 0 -o $idx -ge $dirsize ]
  194.         then
  195.             echo -e "\e[1;31mERROR : incorrect index\e[0m"
  196.             echo '' #blank line skipped because of continue
  197.             continue
  198.         fi
  199.         if [ $((idx-$pos)) -lt 0 -o $((idx-$pos)) -ge $dirsize ]
  200.         then
  201.             echo -e "\e[1;31mERROR : incorrect diff value\e[0m"
  202.             echo '' #blank line skipped because of continue
  203.             continue
  204.         fi
  205.         IFS=
  206.         dirs=( ${dirs[@]:0:$idx-$pos} ${dirs[$idx]} ${dirs[@]:$idx-$pos:$pos} ${dirs[@]:$idx+1} )
  207.         IFS=:
  208.     #déplace un dossier d'une ou plusieurs position vers le bas
  209.     elif [ "${REPLY%% *}" == "movedown" ]
  210.     then
  211.         id1=`expr index "$REPLY" ' '`
  212.         string=${REPLY#* }
  213.         id2=`expr index "$string" ' '`
  214.         idx=${string%% *}
  215.         pos=${string#* }
  216.         id3=`expr index "$pos" ' '`
  217.         if [ $id1 -eq 0 -o $id2 -eq 0 -o $id3 -ne 0 ]
  218.         then
  219.             echo -e "\e[1;31mERROR : incorrect number of arguments\e[0m"
  220.             echo '' #blank line skipped because of continue
  221.             continue
  222.         fi
  223.         if [ $idx -lt 0 -o $idx -ge $dirsize ]
  224.         then
  225.             echo -e "\e[1;31mERROR : incorrect index\e[0m"
  226.             echo '' #blank line skipped because of continue
  227.             continue
  228.         fi
  229.         if [ $((idx-$pos)) -lt 0 -o $((idx-$pos)) -ge $dirsize ]
  230.         then
  231.             echo -e "\e[1;31mERROR : incorrect diff value\e[0m"
  232.             echo '' #blank line skipped because of continue
  233.             continue
  234.         fi
  235.         IFS=
  236.         dirs=( ${dirs[@]:0:$idx} ${dirs[@]:$idx+1:$pos} ${dirs[$idx]} ${dirs[@]:$idx+pos+1} )
  237.         IFS=:
  238.     #remplace le nom d'un dossier
  239.     elif [ "${REPLY%% *}" == "update" -o "${REPLY%% *}" == "replace" ]
  240.     then
  241.         id1=`expr index "$REPLY" ' '`
  242.         string=${REPLY#* }
  243.         id2=`expr index "$string" ' '`
  244.         idx=${string%% *}
  245.         string=${string#* }
  246.         echo "[DEBUG] $id1"
  247.         echo "[DEBUG] $string"
  248.         echo "[DEBUG] $id2"
  249.         echo "[DEBUG] $idx"
  250.         echo "[DEBUG] $string"
  251.         if [ $id1 -eq 0 -o $id2 -eq 0 ]
  252.         then
  253.             echo -e "\e[1;31mERROR : incorrect number of arguments\e[0m"
  254.             echo '' #blank line skipped because of continue
  255.             continue
  256.         fi
  257.         IFS=
  258.         #vérifier s'il y a rien avant
  259.         if [ $idx -eq 0 ]
  260.         then
  261.             dirs=( "$string" ${dirs[@]:1} )
  262.         else
  263.             #dirs=( ${dirs[@]:0:$idx-1} "$string" ${dirs[@]:$idx} )
  264.             #vérifier qu'il y a rien après
  265.             if [ $idx -eq ${#dirs} ]
  266.             then
  267.                 dirs=( ${dirs[@]:0:$idx} "$string" )
  268.             else
  269.                 dirs=( ${dirs[@]:0:$idx} "$string" ${dirs[@]:$idx+1} )
  270.             fi
  271.         fi
  272.         IFS=:
  273.     #afficher l'aide
  274.     elif [ "$REPLY" == "help" ]
  275.     then
  276.         echo -e "\e[34mLISTE DES COMMANDES :\e[0m"
  277.         echo -e "show\tAffiche le contenu du tableau (PATH)"
  278.         echo -e "quit\tQuitte le programme"
  279.         echo -e "exit\tQuitte le programme"
  280.         echo -e "help\tAffiche cette aide"
  281.         echo -e "add_before(\$n,\$d)\tAjoute un dossier \$d avant le dossier n° \$n"
  282.         echo -e "add_after(\$n,\$d)\tAjoute un dossier \$d après le dossier n° \$n"
  283.         echo -e "delete(\$n)\tEfface le dossier n° \$n"
  284.         echo -e "update(\$n,\$d)\tMet à jour le dossier \$d à la \$n position"
  285.         echo -e "replace(\$n,\$d)\tMet à jour le dossier \$d à la \$n position"
  286.         echo -e "move_up($n,$m)\tDeplace le dossier n° \$n de \$m position vers le haut"
  287.         echo -e "move_down($n,$m)\tDeplace le dossier n° \$n de \$m position vers le bas"
  288.     fi
  289.     echo '' #blank line
  290. done
  291.  
  292. #sauvegarde
  293. IFS=:
  294. #echo '{$dirs[@]}=' ${dirs[@]}
  295. #echo '{$dirs[*]}=' ${dirs[*]}
  296. PATH="${dirs[*]}"
  297. export PATH
  298.  
  299. #restauration
  300. IFS=$IFS_OLD
  301. export IFS
  302. #unsets
  303. unset dirs dirsize
  304. unset dirsize i id1 id2 idx ret string IFS_OLD DEBUG
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement