【问题标题】:Shell Script - Make directory if it doesn't existShell 脚本 - 如果目录不存在则创建目录
【发布时间】:2014-05-19 14:54:02
【问题描述】:

我想输入一个目录的名称并检查它是否存在。 如果它不存在我想创建但我收到错误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"
  • 当我忽略 ./ 时,它说无法创建 - 没有这样的文件或目录
  • 尝试引用,也许你有一些空格,它试图做mkdir ./ your_dir而不是mkdir ./your_dir。所以你应该单独使用mkdir "$dirname"

标签: shell directory mkdir


【解决方案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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 请添加更多详细信息,为什么这种方法更好。目前这可能是一条评论。
    • 这里的想法是检查您是否能够ls 目录。如果目录不存在,ls 命令将返回非零退出代码,因此将调用|| 子句右侧的命令。如果目录已经存在,ls 命令将返回 0 - true - 并且仅评估 || 的左侧
    【解决方案3】:
    if [ -L $dirname]
    

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

    if [ -L "$dirname" ]
    

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

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

    如果目录不存在,创建目录的正确方法是

    mkdir -p -- "$dirname"
    

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

    【讨论】:

      【解决方案4】:
      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
      

      【讨论】:

        猜你喜欢
        • 2011-02-25
        • 2018-08-01
        • 2017-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-05
        • 2016-02-02
        • 2015-05-10
        相关资源
        最近更新 更多