需要帮助解决 unix shell 脚本中的一个小错误

Need help in resolving a small error in unix shell scripting

我在使用 unix shell 脚本时遇到问题。

该脚本用于递归重命名带有“-”的空格的文件和目录。 例如 "Stack Overflow" 到 "Stack-Overflow"

这是 运行 完美且有效的,但我收到了这个奇怪的错误,我不知道它是从哪里来的。

我收到以下错误(最后一行), ./script.sh[164]: [: Test.dat: 意外 operator/operand

我知道它会在下面的函数中出现,

fix_dirs fix_files my_rename

但不确定在哪里。

有人可以帮我找出错误吗(抱歉脚本太长了:))?

#!/usr/bin/ksh

USAGE="[=11=] -f directory
[=11=] -d  directory
[=11=] -d -f directory

-f rename files 
-d rename directories 
"

usage ()
{
print -u2 "$USAGE"
exit 1
}

pathname ()
{
print -- "${1%/*}"
}

basename ()
{
print -- "${1##*/}"
}

find_dirs ()
{
find "" -depth -type d -name '* *' -print
}

find_files ()
{
find "" -depth -type f -name '* *' -print
}

my_rename()
{

FROM_DIR="";
TO_DIR="";

if [ ! -w ${FROM_DIR##*/} ]
then
echo "Directory/file ${FROM_DIR##*/} Not Writable";
exit 1
fi

if [ -d "$TO_DIR" -o -f "TO_DIR" ]
then
echo "Target File or Directory already exists - $TO_DIR ";
exit 1
fi

mv "$FROM_DIR" "$TO_DIR"
STATUS=$?
if [ $STATUS -ne 0 ]
then
echo "Error in moving the file or directory";
echo "From directory : $FROM_DIR";
echo "To directory   : $TO_DIR";
fi

}

fix_dirs ()
{

find_dirs ""|while read old_directory ; do
is_root_directory=`echo "old_directory" | grep -c "/"`;
if [[ $is_root_directory -ne 0 ]]
then
new_directory=$(pathname "$old_directory")/$(basename "$old_directory" | tr " " "_")
else
new_directory=$(echo "$old_directory" | tr " " "-")
fi
my_rename "${old_directory}" "${new_directory}"
done

}

fix_files ()
{

find_files ""|while read old_file ; do
new_file=$(pathname "$old_file")/$(basename "$old_file" | tr " " "-")
my_rename "${old_file}" "${new_file}"
done

}

WFILE=
WDIR=
DIR=

if [ "$#" -eq 0 ]
then
usage
fi

while [ $# -gt 0 ] 
do
case  in
-d)
WDIR=1
;;
-f)
WFILE=1
;;
-*)
usage 
;;
*)
if [ -d "" ]
then
DIR=""
else
print -u2 " does not exist ..."
exit 1
fi
;;
esac
shift
done

if [ -z "$DIR" ]
then
echo "Please enter the directory";
exit 1
fi

if [ ${PWD} == "$DIR" ] 
then
echo "Cannot perform rename on current directory";
exit 1
fi

if [ "$DIR" == "." -o "$DIR" == ".." ]
then
echo "cannot rename current or previous directory";
exit 1
fi


if [[ "$WDIR" == "" && "$WFILE" == "" ]] ; then
usage
exit 1
fi

if [ "$WDIR" -a "$WFILE" ]
then
fix_files "$DIR"
fix_dirs "$DIR"
elif [ "$WDIR" ]
then
fix_dirs "$DIR"
elif [ "$WFILE" ]
then
fix_files "$DIR"
fi

运行 "ksh -n" 在您的示例中显示了第 70/71 行可能存在的问题:

foo: warning: line 70: `...` obsolete, use $(...)
foo: warning: line 71: -ne within [[...]] obsolete, use ((...))

相关行是

is_root_directory=`echo "old_directory" | grep -c "/"`;
if [[ $is_root_directory -ne 0 ]]

那是在我的 Debian6 上使用的 ksh93,它可能与您使用的版本不同。但是,您可能会发现对第二行进行建议的更改将使您的警告消失。

非常感谢您提供信息。

我试过 bash 类似于 ksh

bash ./scriptname.sh

我更正了错误。以下是修改后的代码,

my_rename()
    {

    FROM_DIR="";
    TO_DIR="";

    if [ ! -w "${FROM_DIR##*/}" ]
    then
       echo "Directory/file ${FROM_DIR##*/} Not Writable";
       exit 1
    fi

    if [ -d "$TO_DIR" -o -f "TO_DIR" ]
    then
        echo "Target File or Directory already exists - $TO_DIR ";
        exit 1
    fi

    mv "$FROM_DIR" "$TO_DIR"
    STATUS=$?
    if [ $STATUS -ne 0 ]
    then
       echo "Error in moving the file or directory";
       echo "From directory : $FROM_DIR";
       echo "To directory   : $TO_DIR";
    fi

    }

fix_dirs ()
    {

    find_dirs ""|while read old_directory ; do
        is_root_directory=$(echo "$old_directory" | grep -c "/");
        if [ $is_root_directory -ne 0 ]; then
            new_directory=$(pathname "$old_directory")/$(basename "$old_directory" | tr " " "_")
        else
            new_directory=$(echo "$old_directory" | tr " " "-")
        fi
        my_rename "${old_directory}" "${new_directory}"
    done

    }