您好我正在优化我的一些代码,现在想知道为什么这段代码不起作用。
应该发生的是当我复制文件时我必须输入副本的目的地,如果我键入一个不存在的目的地,那么脚本将创建一个目录并将该文件复制到该目录。
这就是我所拥有的,我想知道它为什么不起作用
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
答案 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
。