在linux中苦苦挣扎的shell脚本

时间:2015-11-19 18:13:41

标签: linux shell

我正在尝试创建一个带有两个参数的脚本,源文件夹和目标文件夹。我试图显示一个错误消息,如果找不到源目录并退出该程序。如果找不到目标目录,我希望它创建该目录。然后我想将源目录中的所有内容复制到目标目录。

当我运行程序时,传递了两个参数,例如/ mnt / sdb1和-root / my-documents / photoarch,我会收到错误:

cp:无法统计' / mnt / adb1 /':没有此类文件或目录

我希望它显示我的错误,我已经编码并创建了文件夹,如果尚未创建,但它不会这样做。

由于

#!/bin/sh
clear
#checking that arguments exist
if [ $# -eq 0 ]; then
    echo "Usage: phar image_path archive_path"
elif [ -d $1 ]; then
    echo "Source directory not found"
    exit
elif [ -d $2 ]; then
    mkdir ~root/my-documents/$2
else
    cp -r $1 $2
fi

2 个答案:

答案 0 :(得分:2)

你缺少否定:

elif [ ! -d $1 ]; then
...
elif [ ! -d $2 ]; then

作为最佳做法推荐,我建议您将所有出现的$1$2括在双引号中。否则,您可能会遇到包含空格的路径的问题。例如:

cp -r "$1" "$2"

答案 1 :(得分:0)

在第3个elif子句中,如果目标目录不存在,则创建目标目录,但是将其创建为根目录的子目录,然后尝试复制到目录目录。您刚刚验证的不存在的目录不存在(一旦您将标志反转为@Stefan Majewsky指出)。如果您要将目标目录创建为root的主页(或其他任何地方的子目录),我建议您稍微重构代码以设置SRCDIR和DSTDIR等变量,以便您可以更多如果需要改变,可以轻松操纵它们。有了这个,您可以将代码读取为:

#!/bin/sh
clear
#checking that arguments exist
if [ $# -eq 0 ]; then
    echo "Usage: phar image_path archive_path"
    exit 1
fi
SRCDIR="$1"
DSTDIR="$2"

if [  ! -d $SRCDIR ]; then
    echo "Source directory not found"
    exit
elif [ ! -d $DSTDIR ]; then
    DSTDIR="~root/my-documents/$DSTDIR"
    echo "Creating destination directory $DSTDIR"
    mkdir $DSTDIR
fi

cp -r "$SRCDIR/*" "$DSTDIR"

我希望这能充分回答你的问题。