一元运算符预计有超过1个参数

时间:2014-07-06 16:30:38

标签: shell unix

for var in "$@"
do
 if test -z $var
   then
    echo "missing operand"
 elif [ -d $var ]
   then
    echo "This is a directory"
 elif [ ! -f  $var ]
   then
    echo "The file does not exist"
 else
   basename=$(basename $var)
   dirname=$(readlink -f $var)
   inodeno=$(ls -i $var| cut -d" " -f1)
   read -p "remove regular file $@" input
   if [ $input = "n" ]
   then exit 1
   fi

   mv $var "$var"_"$inodeno"
   echo "$basename"_"$inodeno":"$dirname" >> $HOME/.restore.info
   mv "$var"_"$inodeno"  $HOME/deleted
 fi


done

**您好,上面的代码试图模仿unix中的rm命令。其目的是删除该文件。 例如,如果我输入bash safe_rm file1,它会工作但是如果输入 bash safe_rm file1文件2,它提示我删除文件1两次并给我一个第27行预期的一元操作符(如果[$ input =" n"])。 为什么它不适用于两个文件,理想情况下我希望它提示我删除file1和文件2。 感谢

1 个答案:

答案 0 :(得分:0)

read -p "remove regular file $@" input

应该是

read -p "remove regular file $var" input

这是基本的。

这就是我喜欢这样做的方式:

for T in "$@"; do
    if [[ -z $T ]]; then
        echo "Target is null."
    elif [[ ! -e $T ]]; then
        echo "Target does not exist: $T"
    elif [[ -d $T ]]; then
        echo "Target can't be a directory: $T"
    else
        BASE=${T##*/}
        DIRNAME=$(exec dirname "$T")  ## Could be simpler but not sure how you want to use it.
        INODE_NUM=$(exec stat -c '%i' "$T")
        read -p "Remove regular file $T? "
        if [[ $REPLY == [yY] ]]; then
            # Just copied. Not sure about its logic.
            mv "$T" "${T}_${INODE_NUM}"
            echo "${BASE}_${INODE_NUM}:${DIRNAME}" >> "$HOME/.restore.info"
            mv "${T}_${INODE_NUM}" "$HOME/deleted"
        fi
    fi
done
相关问题