bash复制文件到新目标(如果不存在)创建一个新目录

时间:2014-04-20 20:13:46

标签: bash shell unix

您好我正在优化我的一些代码,现在想知道为什么这段代码不起作用。

应该发生的是当我复制文件时我必须输入副本的目的地,如果我键入一个不存在的目的地,那么脚本将创建一个目录并将该文件复制到该目录。

这就是我所拥有的,我想知道它为什么不起作用

echo "Current Directory "
        ls -a;
        echo -n "Please Enter file name to Copy: "
        read fileToCopy
        echo -n "Enter Destination for Copy: ~/ "
        read location
        if [ -d $location ]
        then
                cp $fileToCopy $location
                echo "File Successfully Copied to ~/ $location "
        elif [ !-d $location ]
        then
                mkdir $location
                cp $fileToCopy $location
                echo "$location was created and the File was Copied to It! "
                echo -n "Press Enter to Continue: "
        else
                echo "That file Does Not Exist! "
        fi

2 个答案:

答案 0 :(得分:1)

两个问题:

一:

elif [ !-d $location ]

您需要!-d之间的空格。

两个

引用您的变量。

答案 1 :(得分:0)

错误检查总是好的。如果用户没有输入目录名或要复制的文件怎么办?

在shell中,null变量将在如下语句中导致错误:

if [ $dir -eq foo ]
then
    …
fi

那是因为shell将直接替换该值然后解释该行。如果$dir为null,则语句为:

if [ -eq foo ]
then
    …
fi

这不是有效的。如果您在$dir附近有引号:

if [ "$dir" -eq foo ]
then
    …
fi

你得到了这个:

if [ "" -eq foo ]
then
    …
fi

哪个有效。

如果你正在使用bash,最好使用双方括号:

if [[ $dir -eq foo ]]
then
    …
fi

这是一个特殊的改进的语法测试,它将使用空格处理空变量和变量,而不必使用引号。

!是一个特殊的shell运算符,它否定了命令/语句的返回值。要使shell了解运算符,必​​须确保它的两侧都有空白区域。还要测试mkdir语句的输出以确保它有效。并使用-p参数。这将创建父目录。

 if [[ ! -d "$dir" ]]
 then
     if ! mkdir -p "$dir" 
     then
         echo "Could not create dir '$dir'" 1>&2
         exit 2
     fi
 fi

请注意,我总是在变量周围加上引号,并使用if语句来测试我的命令是否成功。毕竟,用户可能试图创建一个我没有写入权限的目录。

另一个秘密技巧。您可以使用set -xv打开shell脚本调试。这将打印出写入的每个语句,然后在shell解释它。要关闭它,请使用set +xv