135 votes

Comment concaténer deux chaînes pour construire un chemin complet

J'essaie d'écrire un scénario bash. Dans ce script, je veux que l'utilisateur saisisse le chemin d'un répertoire. Ensuite, je veux ajouter quelques chaînes à la fin de cette chaîne et construire un chemin vers certains sous-répertoires. Par exemple, supposez que l'utilisateur saisisse une chaîne comme ceci :

/home/user1/MyFolder

Maintenant, je veux créer 2 sous-répertoires dans ce répertoire et y copier des fichiers.

/home/user1/MyFolder/subFold1
/home/user1/MyFolder/subFold2

Comment je peux faire ça ?

208voto

Dunes Points 6740

La norme POSIX exige que plusieurs / soient traités comme un seul / dans un nom de fichier. Ainsi //dir///subdir////file est le même que /dir/subdir/file.

En tant que telle, concaténer deux chaînes pour construire un chemin complet est aussi simple que :

full_path="$part1/$part2"

46voto

Sean Bright Points 39480
#!/bin/bash

read -p "Enter a directory: " BASEPATH

SUBFOLD1=${BASEPATH%%/}/subFold1
SUBFOLD2=${BASEPATH%%/}/subFold2

echo "I will create $SUBFOLD1 and $SUBFOLD2"

# mkdir -p $SUBFOLD1
# mkdir -p $SUBFOLD2

Et si vous voulez utiliser readline pour que vous obteniez terminé et tout cela, ajoutez un -e à l'appel à read :

read -e -p "Enter a directory: " BASEPATH

6voto

Carlo Wood Points 1275

Le script suivant contient plusieurs chemins (relatifs/absolus) (BASEPATH) avec un chemin relatif (SUBDIR) :

shopt -s extglob
SUBDIR="subdir"
for BASEPATH in '' / base base/ base// /base /base/ /base//; do
  echo "BASEPATH = \"$BASEPATH\" --> ${BASEPATH%%+(/)}${BASEPATH:+/}$SUBDIR"
done

Dont la sortie est :

BASEPATH = "" --> subdir
BASEPATH = "/" --> /subdir
BASEPATH = "base" --> base/subdir
BASEPATH = "base/" --> base/subdir
BASEPATH = "base//" --> base/subdir
BASEPATH = "/base" --> /base/subdir
BASEPATH = "/base/" --> /base/subdir
BASEPATH = "/base//" --> /base/subdir

Le shopt -s extglob n'est nécessaire que pour permettre à BASEPATH de se terminer sur plusieurs slashs (ce qui est probablement absurde). Sans extension de globing, vous pouvez simplement utiliser :

echo ${BASEPATH%%/}${BASEPATH:+/}$SUBDIR

ce qui se traduirait par le moins soigné mais toujours fonctionnel :

BASEPATH = "" --> subdir
BASEPATH = "/" --> /subdir
BASEPATH = "base" --> base/subdir
BASEPATH = "base/" --> base/subdir
BASEPATH = "base//" --> base//subdir
BASEPATH = "/base" --> /base/subdir
BASEPATH = "/base/" --> /base/subdir
BASEPATH = "/base//" --> /base//subdir

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X