Ceci est une ancienne révision du document !


Bash

:!: le shell par défaut à la création du compte est /bin/bash. Vous pouvez demander à en changer via les formulaires web.

Cliquez pour afficher ⇲

Cliquez pour masquer ⇱

Environnement Debian 7 de base au PSMN, charger le modulefile Base/psmn

Références

Ordre de chargement des config de shell

  • Bash vs zsh

Voir ces schémas (en) :

Expected behavior:

Reality goes ugly:

Source: http://blog.flowblok.id.au/2013-02/shell-startup-scripts.html

(outil de création des diagrammes : http://hg.flowblok.id.au/shell-startup)

(FIXME si quelqu'un à la même chose pour tcsh, ça m'interesse…)

Shellshock

FIXME

problème avec modulefiles, /usr/share/modules/init/bash, soumission de jobs

/bin/bash: module: line 1: syntax error: unexpected end of file
/bin/bash: error importing function definition for `BASH_FUNC_module'

Exemples & Astuces

Debugging

  • Use “strict mode with pipefail” (exit without continuing at first error)
set -euo pipefail
  • Trace each command verbosely :
set -x
  • explain code & errors
shellcheck monscript.sh

string replace

  • remplace home par scratch depuis SGE_O_WORKDIR, sauve dans SCRATCHDIR
SCRATCHDIR=${SGE_O_WORKDIR/home/scratch}
  • nomme $OUTFILE et $LOGFILE selon $INFILE (en changeant l'extension)
INFILE=$1
TMPNAME=$(basename ${INFILE%.*})
OUTFILE="$TMPNAME"-done.hdf5
LOGFILE="$TMPNAME".log
  • Message d'erreur explicite en cas de variable non-settée
# ${TMPDIR:?"TMPDIR nonexistent"}
 
result=$(ls ${TMPDIR:?"TMPDIR nonexistent"})
if [[ "$result" == "nonexistent" ]]
then
    echo "TMPDIR n'a pas été crée !"
    exit 1
fi

pattern matching

#! /bin/bash
 
VARIABLE="Let's test this string!"
 
# This is for regular expressions:
if [[ "$VARIABLE" =~ "Let's.*ring" ]]
then
    echo "matched"
else
    echo "nope"
fi
 
# And here we have Bash Patterns:
if [[ "$VARIABLE" == L*ing! ]]
then
    echo "matched"
else
    echo "nope"
fi
#! /bin/bash
 
VARIABLE="Let's test this string!"
 
# This is for regular expressions:
if [[ "$VARIABLE" =~ "Let's.*ring" ]]
then
    echo "#1 matched"
else
    echo "#1 nope"
fi
 
if [[ "$VARIABLE" =~ Let\'s.*ring ]]
then
    echo "#2 matched"
else
    echo "#2 nope"
fi

Results: #1 nope #2 matched

To get #1 matching remove quotes around RegExpr or set compat31 : shopt -s compat31

#!/bin/sh
 
thisString="1 2 3 4 5"
searchString="1 2"
# if you single quote your input, you could do this
# searchString=$1
 
case $thisString in
  # match exact string
  "$searchString") echo yep, it matches exactly;;
 
  # match start of string
  "$searchString"*) echo yep, it matches at the start ;;
 
  # match end of string
  *"$searchString") echo yep, it matches at the end ;;
 
  # searchString can be anywhere in thisString
  *"$searchString"*) echo yep, it matches in the middle somewhere ;;
 
  *) echo nope ;;
esac

Tableaux associatifs

On peut nommer les entrées d'un tableau (l'index).

  • astuce :
tab[wwsi]="whatever/wwsi"
tab[wwoz]="whatever/to/wwoz"
tab[fip]="http://audio.scdn.arkena.com/11016/fip-midfi128.mp3"

Lister le tableau associatif :

  • brute :
for i in ${tab[@]}; do echo $i; done
  • astuce (boucle induite) :
printf "%s\n" "${tab[@]}"; done

Simplification de code résultante :

Parcours du tableau, connaissant l'index (ici $value).

  • Avant :
tindex=$(for i in ${tab[@]}; do echo $i; done | grep ${value})
for ((i=0; i<${#tab[@]}; i++))
do
  if [[ "$tindex" == "{tab[$i]}" ]]
  then
    data=${tab[$i]}
  fi
done
  • Aprés :
tindex=$(printf "%s\n" "${tab[@]}" | grep ${value})
data="${tab[$tindex]}"
documentation/tools/langages/bash.1557930034.txt.gz · Dernière modification : 2020/08/25 15:58 (modification externe)