Mon script:
#!/usr/bin/env bash
PATH=/home/user/example/foo/bar
mkdir -p /tmp/backup$PATH
Et maintenant je veux obtenir le premier dossier de "$ PATH":/home /
cd /tmp/backup
rm -rf ./home/
cd - > /dev/null
Comment puis-je toujours détecter le premier dossier comme dans l'exemple ci-dessus? "dirname $ PATH" ne fait que renvoyer "/ home/utilisateur/exemple/foo /".
Merci d'avance! :)
J'ai trouvé une solution:
#/usr/bin/env bash
DIRECTORY="/home/user/example/foo/bar"
BASE_DIRECTORY=$(echo "$DIRECTORY" | cut -d "/" -f2)
echo "#$BASE_DIRECTORY#";
Cela retourne toujours le premier répertoire. Dans cet exemple, il retournerait ce qui suit:
#home#
Merci à @condorwasabi pour son idée avec awk! :)
Si PATH
a toujours une forme absolue, vous pouvez faire des astuces comme
ROOT=${PATH#/} ROOT=/${ROOT%%/*}
Ou
IFS=/ read -ra T <<< "$PATH"
ROOT=/${T[1]}
Cependant, je devrais également ajouter à cela qu'il est préférable d'utiliser d'autres variables et de ne pas utiliser PATH
car cela modifierait vos répertoires de recherche pour les fichiers binaires, à moins que vous n'en ayez vraiment l'intention.
Vous pouvez également choisir de convertir votre chemin en forme absolue via readlink -f
ou readlink -m
:
ABS=$(readlink -m "$PATH")
Vous pouvez également vous référer à ma fonction getabspath .
Vous pouvez essayer cette commande awk:
basedirectory=$(echo "$PATH" | awk -F "/" '{print $2}')
À ce stade, basedirectory
sera la chaîne home Ensuite, vous écrivez:
rm -rf ./"$basedirectory"/
Pour obtenir le premier répertoire:
path=/home/user/example/foo/bar
mkdir -p "/tmp/backup$path"
cd /tmp/backup
arr=( */ )
echo "${arr[0]}"
PS: N'utilisez jamais la variable PATH dans votre script car elle remplacera PATH par défaut et votre script ne sera pas en mesure d'exécuter de nombreux utilitaires système
EDIT: Cela devrait probablement fonctionner pour vous:
IFS=/ && set -- $path; echo "$2"
home
Pure bash:
DIR="/home/user/example/foo/bar"
[[ "$DIR" =~ ^[/][^/]+ ]] && printf "$BASH_REMATCH"
Facile à modifier la regex.