2014-04-07 140 views
4

我想输入一个目录的名称并检查它是否存在。 如果它不存在,我想创建,但我得到的错误mkdir: cannot create directory'./' File existsShell脚本 - 使目录不存在

我的代码说,该文件存在,即使它没有。我究竟做错了什么?

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 
+0

为什么'mkdir ./$ dirname'而不仅仅是'mkdir'$ dirname“'? – fedorqui

+0

当我离开./它说不能创建 - 没有这样的文件或目录 – Pizzaman

+0

尝试引用,也许你有一些空间,它正在尝试做'mkdir ./ your_dir'而不是'mkdir。/ your_dir'。所以你应该单独使用'mkdir“$ dirname”'。 – fedorqui

回答

6
if [ -L $dirname] 

看该生产线生产的错误消息:“[:缺少`] ''或者其他的(取决于你使用的是哪个shell)。你需要在括号内有一个空格。除非使用双括号,否则还需要在变量扩展周围使用双引号;您可以使用learn the rules或使用简单规则:始终使用双引号围绕变量替换和命令替换 - "$foo""$(foo)"

if [ -L "$dirname" ] 

然后出现逻辑错误:只有当存在不指向目录的符号链接时才创建目录。你大概是想在那里否定一下。

不要忘记,脚本运行时可能会创建该目录,因此您的检查可能会显示该目录不存在,但当您尝试创建它时该目录将存在。 Never do “check then do”, always do “do and catch failure”

创建一个目录,如果不存在,正确的做法是

mkdir -p -- "$dirname" 

(双引号的情况下,$dirname包含空格或的通配符,万一--它开始与-。)

0
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

尝试此代码:

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 
1

试试这个:ls yourdir 2>/dev/null||mkdir yourdir,这是微小和简洁,并履行您的任务。

+0

请添加一些更详细的信息,为什么这种方法更好..目前这可能是一个评论。 – Jayan

+0

这里的想法是检查你是否能够“目录”。如果该目录不存在,'ls'命令将返回一个非零的退出代码,从而调用'||'子句右侧的命令。如果该目录已经存在,那么'ls'命令将返回'0' - 真 - 只有'||'的左手边将被评估 – Steen