web-dev-qa-db-fra.com

Script Shell - Créer un répertoire s'il n'existe pas

Je souhaite saisir le nom d'un répertoire et vérifier s'il existe. S'il n'existe pas, je veux créer mais j'obtiens l'erreur mkdir: cannot create directory'./' File exists

Mon code dit que le fichier existe même s'il ne l'est pas. Qu'est-ce que je fais mal?

echo "Enter directory name"
read dirname

if [[ ! -d "$dirname" ]]
then
    if [ -L $dirname]
then
    echo "File doesn't exist. Creating now"
    mkdir ./$dirname
    echo "File created"
    else
        echo "File exists"
    fi
fi
7
Pizzaman
if [ -L $dirname]

Regardez le message d'erreur produit par cette ligne: "[: manquant"] "" ou quelque chose comme ça (selon le Shell que vous utilisez). Vous avez besoin d'un espace à l'intérieur des supports. Vous avez également besoin de guillemets doubles autour de l'expansion des variables, sauf si vous utilisez des crochets doubles; vous pouvez soit apprendre les règles , soit utiliser une règle simple: toujours utiliser des guillemets autour de la substitution de variable et de la substitution de commande - "$foo", "$(foo)".

if [ -L "$dirname" ]

Ensuite, il y a une erreur logique: vous ne créez le répertoire que s'il existe un lien symbolique qui ne pointe pas vers un répertoire. Vous vouliez probablement avoir une négation là-dedans.

N'oubliez pas que le répertoire peut être créé pendant l'exécution de votre script, il est donc possible que votre vérification montre que le répertoire n'existe pas, mais le répertoire existera lorsque vous essayez de le créer. Ne faites jamais "vérifiez puis faites", faites toujours "faites et rattrapez l'échec" .

La bonne façon de créer un répertoire s'il n'existe pas est

mkdir -p -- "$dirname"

(Les guillemets doubles dans le cas où $dirname Contient des espaces ou des caractères globbing, le -- Dans le cas où il commence par -.)

Essayez ce code:

echo "Enter directory name"
read dirname

if [ ! -d "$dirname" ]
then
    echo "File doesn't exist. Creating now"
    mkdir ./$dirname
    echo "File created"
else
    echo "File exists"
fi

Journal de sortie:

Chitta:~/cpp/Shell$ ls
dir.sh

Chitta:~/cpp/Shell$ sh dir.sh
Enter directory name
New1
File doesn't exist. Creating now
File created

chitta:~/cpp/Shell$ ls
New1  dir.sh

Chitta:~/cpp/Shell$ sh dir.sh
Enter directory name
New1
File exists

Chitta:~/cpp/Shell$ sh dir.sh
Enter directory name
New2
File doesn't exist. Creating now
File created

Chitta:~/cpp/Shell$ ls
New1  New2  dir.sh
4
Chitta ranjan

essaye ça: ls yourdir 2>/dev/null||mkdir yourdir, qui est minuscule et concis et remplit votre tâche.

2
squid
read -p "Enter Directory Name: " dirname
if [[ ! -d "$dirname" ]]
then
        if [[ ! -L $dirname ]]
        then
                echo "Directory doesn't exist. Creating now"
                mkdir $dirname
                echo "Directory created"
        else
                echo "Directory exists"
        fi
fi
1
Vasanta Koli