Shell脚本 - 如果目录不存在则创建

20
我想输入一个目录的名称并检查它是否存在。如果不存在,我想创建它,但是我得到了错误消息mkdir: cannot create directory'./' File exists
我的代码显示该文件已经存在,即使它实际上不存在。我做错了什么?
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

为什么要使用mkdir ./$dirname而不是mkdir "$dirname" - fedorqui
当我省略了"./"时,它会显示无法创建 - 没有这样的文件或目录。 - Pizzaman
尝试加引号,也许你的目录名周围有一些空格,它正在尝试执行 mkdir ./ your_dir 而不是 mkdir ./your_dir。因此,你应该单独使用 mkdir "$dirname" - fedorqui
4个回答

23
if [ -L $dirname]

看看这行代码产生的错误信息:“[: missing `]'”或类似的消息(取决于你使用的shell)。括号内需要一个空格。除非使用双括号,否则变量展开周围需要双引号;您可以了解规则,也可以使用简单规则:始终在变量替换和命令替换周围使用双引号"$foo""$(foo)"

if [ -L "$dirname" ]

接下来有一个逻辑错误:只有当符号链接不指向目录时,才会创建目录。你可能想在这里加入否定。

别忘了,在脚本运行时目录可能已经被创建,所以你的检查可能会显示目录不存在,但是当你尝试创建它时目录将存在。永远不要“先检查再执行”,而应该“先执行并捕获失败”

创建目录的正确方法是:

mkdir -p -- "$dirname"

(如果$dirname包含空格或通配符字符,则需要双引号,如果以-开头,则需要--。)

9

尝试使用以下代码:

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

输出日志:

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

6
尝试这个:ls yourdir 2>/dev/null||mkdir yourdir,它又小又简洁,可以完成你的任务。

1
请添加更多细节,说明为什么这种方法更好。目前这只是一条注释。 - Jayan
2
这里的想法是检查您是否能够ls目录。如果目录不存在,则ls命令将返回非零退出代码,从而将调用||子句右侧的命令。如果目录已经存在,则ls命令将返回0-true-,并且只会评估||左侧的内容。 - Steen

5
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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接