bash中的参数太多错误

时间:2014-01-21 09:26:09

标签: bash shell unix

我正在编写一个脚本来删除目录中的所有文件以进行练习。我在变量周围使用引号,但我仍然收到以下错误:

/usr/local/bin/deleteall: line 6: [: too many arguments
/usr/local/bin/deleteall: line 11: [: too many arguments 

这是我的代码:

#!/bin/bash
#Deletes all files in the current directory

read -p "You are about to delete all files in $(pwd). Are you sure you want to do this? y/n" yn
echo $yn
if [ [ "$yn" = "y" ] -o [ "$yn" = "Y" ] ] ; then
        for i in `ls`; do
                rm $i
        done
        exit;
elif [ [ "$yn" = "n" ] -o [ "$yn" = "N" ] ] ; then
        exit;
else
        read -p "Please enter y (yes) or n (no)"
        exit;
fi

这是整个输出:

You are about to delete all files in <my dir>. Are you sure you want to do this? y/nn
n
/usr/local/bin/deleteall: line 6: [: too many arguments
/usr/local/bin/deleteall: line 11: [: too many arguments
Please enter y (yes) or n (no)n

我做错了什么?

3 个答案:

答案 0 :(得分:5)

此行似乎有问题:

if [ [ "$yn" = "y" ] -o [ "$yn" = "Y" ] ] ; then

您可以将其替换为:

if [[ "$yn" == [yY] ]]; then

PS:对您检查n or N的行执行相同操作。

答案 1 :(得分:2)

您无法嵌套[]。它实际上是将嵌套括号解释为参数,并打印出错误太多的错误。

这会起作用

if [ "$yn" = "y" -o "$yn" = "Y" ]; then

另一种使用双括号和相同逻辑的替代语法

if [[ $yn == "y" || $yn == "Y" ]]; then 

另外

for i in `ls`; do
  rm $i
done

应该是

for i in *; do
  [ -f "$i" ] && rm $i
done

所以它只会尝试删除常规文件(除非你覆盖rm,否则你会得到dirs的错误,你可以决定你想用符号链接做什么)。 ls只是无关紧要。

答案 2 :(得分:0)

这就是你想要的:

read -p "Are you sure? " -n 1 -r
echo    # (optional) move to a new line
if [[ $REPLY =~ ^[Yy]$ ]]
then
     for i in `ls`; do
      rm -rf $i
done
fi

if [[ $REPLY =~ ^[Nn]$ ]]
then
     #do what you want
done
fi