Outils pour utilisateurs

Outils du site


linux:bash (lu 64556 fois)

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
linux:bash [11-09-2017 17:24]
edmc73 [rbash (restrited bash)]
linux:bash [07-05-2023 20:38] (Version actuelle)
edmc73 [Date de fichier]
Ligne 49: Ligne 49:
   echo $toto   echo $toto
   echo ${toto}   echo ${toto}
 +  cpt=1
 +  echo $((cpt++))
 +  echo $((cpt+15))
  
 Tableau associatif ( http://www.artificialworlds.net/blog/2012/10/17/bash-associative-array-examples/ ) Tableau associatif ( http://www.artificialworlds.net/blog/2012/10/17/bash-associative-array-examples/ )
Ligne 84: Ligne 87:
 $ echo ${#MYMAP[@]}  # Number of keys in an associative array $ echo ${#MYMAP[@]}  # Number of keys in an associative array
 2 2
 +</code>
 +
 +Faire une liste simple
 +<code>
 +list=(
 +  aaa
 +  bbb
 +  ccc
 +  ddd
 +)
 +
 +$ echo $list
 +aaa
 +
 +$ echo ${list[@]}
 +aaa bbb ccc ddd
 +
 +$ echo ${list[1]}
 +bbb
 +
 +$ for i in ${list[@]}; do echo $i; done
 +aaa
 +bbb
 +ccc
 +ddd
 +
 </code> </code>
 ===== Manipuler du texte ===== ===== Manipuler du texte =====
Ligne 314: Ligne 343:
 </code> </code>
  
 +Tester le contenu d'une chaine avec du regex
  
 +Tester une date yyyymmdd de facon très simple
 +
 +<code bash>
 +[[ $date =~ ^[0-9]{8}$ ]] && echo "yes"
 +</code>
 +
 +ou plus complet
 +
 +<code bash>
 +[[ $date =~ ^[0-9]{4}(0[1-9]|1[0-2])(0[1-9]|[1-2][0-9]|3[0-1])$ ]] && echo "yes"
 +#           |^^^^^^^^ ^^^^^^ ^^^^^^  ^^^^^^ ^^^^^^^^^^ ^^^^^^ |
 +#                 ^^^^^^^^^^^^^  ^^^^^^^^^^^^^^^^^^^^^^^^ |
 +#                      |                                |
 +#                                        |              |
 +#           | --year--   --month--           --day--          |
 +#                    either 01...09      either 01..09     end of line
 +# start of line            or 10,11,12         or 10..29
 +#                                              or 30, 31
 +</code>
 +
 +That is, you can define a regex in Bash matching the format you want. This way you can do:
 +
 +<code bash>
 +[[ $date =~ ^regex$ ]] && echo "matched" || echo "did not match"
 +</code>
 +where commands after && are executed if the test is successful, and commands after || are executed if the test is unsuccessful.
 +
 +Note this is based on the solution by Aleks-Daniel Jakimenko in User input date format verification in bash.
 +
 +In other shells you can use grep. If your shell is POSIX compliant, do
 +
 +<code bash>
 +(echo "$date" | grep -Eq  ^regex$) && echo "matched" || echo "did not match"
 +</code>
 +In fish, which is not POSIX-compliant, you can do
 +
 +<code bash>
 +echo "$date" | grep -Eq "^regex\$"; and echo "matched"; or echo "did not match"
 +</code>
 ===== Boucle ===== ===== Boucle =====
  
Ligne 348: Ligne 417:
   for i in {1..5}; do COMMAND-HERE; done   for i in {1..5}; do COMMAND-HERE; done
  
 +  for X in /dev/sd*; do echo $X; smartctl -a $X | grep overall; done
 +<code>
 +~# for X in {a..z}; do smartctl -a /dev/sd$X | grep overall; done
 +SMART overall-health self-assessment test result: PASSED
 +SMART overall-health self-assessment test result: PASSED
 +SMART overall-health self-assessment test result: PASSED
 +SMART overall-health self-assessment test result: PASSED
 +...
 +</code>
  
 ===== Suppression d'un grand nombre de fichiers ===== ===== Suppression d'un grand nombre de fichiers =====
Ligne 372: Ligne 450:
 Pour savoir combien de fichiers vont être effacés Pour savoir combien de fichiers vont être effacés
   find . -name "*" | wc -l   find . -name "*" | wc -l
 +  
 +
 +Garder les 5 fichiers les plus récents et supprimer le reste
 +  ls -c *.txt | tail -n +5 | xargs rm
 +
 ===== Taille de plusieurs répertoires ===== ===== Taille de plusieurs répertoires =====
 Permet d'afficher la taille des répertoires du répertoire courant. Permet d'afficher la taille des répertoires du répertoire courant.
Ligne 380: Ligne 463:
  
 Affiche la taille des répertoires en ignorant les autres disques (sans compter les /mnt, /media..) et trie du plus petit au plus grand. Affiche la taille des répertoires en ignorant les autres disques (sans compter les /mnt, /media..) et trie du plus petit au plus grand.
-  du -x -h --max-depth=1 | sort -h+  du -xhcs --max-depth=1 | sort -h
  
 Compter le nombre de fichier récursivement sans compter les répertoires Compter le nombre de fichier récursivement sans compter les répertoires
Ligne 387: Ligne 470:
 Compter le nombre de répertoire Compter le nombre de répertoire
   ls -dR repertoire/* | wc -l   ls -dR repertoire/* | wc -l
 +  
 +
 +Un petit programme nommé **ncdu** dispo dans les dépots permet d'afficher sous forme graphique la taille des répertoires et de naviguer à l'intérieur
 ===== Faire un prompt ===== ===== Faire un prompt =====
  
Ligne 396: Ligne 482:
 select CHOIX in "${LISTE[@]}" ; do select CHOIX in "${LISTE[@]}" ; do
     case $REPLY in     case $REPLY in
-        1|y)+        yes|y)
         echo ok         echo ok
         break         break
         ;;         ;;
-        2|n)+        no|n)
         echo ko         echo ko
         break         break
         ;;         ;;
 +        *) echo "invalid option $REPLY";;
     esac     esac
 done done
 </code> </code>
  
 +Demander de saisir un texte
 +<code bash>
 +echo Hello, who am I talking to?
 +read varname
 +echo It\'s nice to meet you $varname
 +</code>
 ===== echo ===== ===== echo =====
  
Ligne 751: Ligne 844:
 Modify: 2015-01-01 00:00:00.000000000 +0000 Modify: 2015-01-01 00:00:00.000000000 +0000
 Change: 2016-07-04 08:48:40.464863103 +0000  Change: 2016-07-04 08:48:40.464863103 +0000 
 +
 +On peut aussi utiliser la notation suivante
 +# touch -d "-1 day" toto.txt
 </code> </code>
  
Ligne 812: Ligne 908:
 Très utile quand on lance un script toutes les minutes pour éviter de se retrouver avec 500 process qui tournent en même dans le cas ou la réponse du script dépasserait la minute Très utile quand on lance un script toutes les minutes pour éviter de se retrouver avec 500 process qui tournent en même dans le cas ou la réponse du script dépasserait la minute
  
 +===== ls et le globbing (ou filtrage avancé) =====
 +
 +<code bash>
 +bash$ ls -l
 +total 2
 + -rw-rw-r--    1 bozo  bozo         0 Aug  6 18:42 a.1
 + -rw-rw-r--    1 bozo  bozo         0 Aug  6 18:42 b.1
 + -rw-rw-r--    1 bozo  bozo         0 Aug  6 18:42 c.1
 + -rw-rw-r--    1 bozo  bozo       466 Aug  6 17:48 t2.sh
 + -rw-rw-r--    1 bozo  bozo       758 Jul 30 09:02 test1.txt
 +
 +bash$ ls -l t?.sh
 + -rw-rw-r--    1 bozo  bozo       466 Aug  6 17:48 t2.sh
 +
 +bash$ ls -l [ab]*
 + -rw-rw-r--    1 bozo  bozo         0 Aug  6 18:42 a.1
 + -rw-rw-r--    1 bozo  bozo         0 Aug  6 18:42 b.1
 +
 +bash$ ls -l [a-c]*
 + -rw-rw-r--    1 bozo  bozo         0 Aug  6 18:42 a.1
 + -rw-rw-r--    1 bozo  bozo         0 Aug  6 18:42 b.1
 + -rw-rw-r--    1 bozo  bozo         0 Aug  6 18:42 c.1
 +
 +bash$ ls -l [^ab]*
 + -rw-rw-r--    1 bozo  bozo         0 Aug  6 18:42 c.1
 + -rw-rw-r--    1 bozo  bozo       466 Aug  6 17:48 t2.sh
 + -rw-rw-r--    1 bozo  bozo       758 Jul 30 09:02 test1.txt
 +
 +bash$ ls -l {b*,c*,*est*}
 + -rw-rw-r--    1 bozo  bozo         0 Aug  6 18:42 b.1
 + -rw-rw-r--    1 bozo  bozo         0 Aug  6 18:42 c.1
 + -rw-rw-r--    1 bozo  bozo       758 Jul 30 09:02 test1.txt
 +</code>
 + source: http://tldp.org/LDP/abs/html/globbingref.html
 +
 +
 +===== Problème d'affichage sur la ligne du prompt =====
 +
 +Avec certain prompt fantaisiste, il peut y avoir des problème d'affichage notamment quand on remonte dans l'historique des commandes, ça peut vite devenir illisible.
 +
 +D'où l'importance d'entourer vos codes couleurs dans la variable PS1 par \[   et   \]
 +
 +Si vous appelez une fonction dans la variable PS1, il faudra entourer le code couleur par \001   et   \002
 +
 +(voir le code dans le chapitre suivant)
 + 
 +source: http://mywiki.wooledge.org/BashFAQ/053
 +
 +Mots clés pour recherche sur le web: Line wrapping issues in Bash
 +
 +===== Afficher le status de la dernière commande dans le prompt =====
 +
 +Ajoutez dans votre .bashrc ce petit bout de code
 +
 +<code bash>
 +get_exit_status(){
 +  es=$?
 +  if [ $es -eq 0 ]
 +  then
 +    echo -e '\001\033[0;32m\002✔\001\033[0;0m\002'
 +  else
 +    echo -e '\001\033[0;31m\002✘ '$es'\001\033[0;0m\002'
 +  fi
 +}
 +
 +PS1='$(get_exit_status) \[\033[1;34m\]\u:\[\033[0;36m\]\W\[\033[0;0m\] $ '
 +</code>
linux/bash.1505143490.txt.gz · Dernière modification: 11-09-2017 17:24 de edmc73