J'essaie d'écrire un script bash qui contient une fonction qui, lorsqu'on lui donne un fichier .tar
, .tar.bz2
, .tar.gz
etc., utilise tar avec les commutateurs appropriés pour décompresser le fichier.
J'utilise des instructions if elif then qui testent le nom du fichier pour voir ce qui le termine et je n'arrive pas à le faire correspondre en utilisant des métacaractères regex.
Pour ne pas avoir à réécrire constamment le script, j'utilise 'test' ; à la ligne de commande, j'ai pensé que l'instruction ci-dessous devrait fonctionner, j'ai essayé toutes les combinaisons possibles de parenthèses, de guillemets et de métacaractères et cela ne fonctionne toujours pas.
test sed-4.2.2.tar.bz2 = tar\.bz2$; echo $?
(this returns 1, false)
Je suis sûr que le problème est simple et j’ai cherché partout, mais je n’arrive pas à comprendre comment faire. Quelqu'un sait-il comment je peux m'y prendre ?
Pour faire correspondre des regex, vous devez utiliser l'opérateur =~
.
Essayez ceci :
[[ sed-4.2.2.tar.bz2 =~ tar.bz2$ ]] && echo matched
Vous pouvez également utiliser des caractères génériques (au lieu des regex) avec l'opérateur ==
:
[[ sed-4.2.2.tar.bz2 == *tar.bz2 ]] && echo matched
Si la portabilité n'est pas un problème, je recommande d'utiliser [[
au lieu de [
ou test
car c'est plus sûr et plus puissant. Voir [Quelle est la différence entre test, [ et [[ ?]][1] pour plus de détails.
extract () {
if [ -f $1 ] ; then
case $1 in
*.tar.bz2) tar xvjf $1 ;;
*.tar.gz) tar xvzf $1 ;;
*.bz2) bunzip2 $1 ;;
*.rar) rar x $1 ;;
*.gz) gunzip $1 ;;
*.tar) tar xvf $1 ;;
*.tbz2) tar xvjf $1 ;;
*.tgz) tar xvzf $1 ;;
*.zip) unzip $1 ;;
*.Z) uncompress $1 ;;
*.7z) 7z x $1 ;;
*) echo "don't know '$1'..." ;;
esac
else
echo "'$1' is not a valid file!"
fi
}
En réponse à Aquarius Power dans le commentaire ci-dessus, Nous devons stocker la regex dans un var
.
La variable BASH_REMATCH est définie après que vous ayez fait correspondre l'expression, et ${BASH_REMATCH[n]} correspondra au nième groupe entouré de parenthèses, c'est-à-dire que dans les exemples suivants, ${BASH_REMATCH[1]} = "compressed"
et ${BASH_REMATCH[2]} = " ;.gz"
.
if [[ "compressed.gz" =~ ^(.*)(\.[a-z]{1,5})$ ]];
then
echo ${BASH_REMATCH[2]} ;
else
echo "Not proper format";
fi
(L'expression rationnelle ci-dessus n'est pas censée être valable pour les noms et extensions de fichiers, mais elle fonctionne pour l'exemple).