Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
bash中参数过多错误_Bash_Shell_Unix - Fatal编程技术网

bash中参数过多错误

bash中参数过多错误,bash,shell,unix,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 t

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

/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
您将要删除中的所有文件。你确定要这样做吗?是/否
N
/usr/local/bin/deleteall:第6行:[:参数太多
/usr/local/bin/deleteall:第11行:[:参数太多
请输入y(是)或n(否)n

我做错了什么?

这一行似乎有问题:

if [ [ "$yn" = "y" ] -o [ "$yn" = "Y" ] ] ; then
您可以将其替换为:

if [[ "$yn" == [yY] ]]; then
PS:对您选中的
n或n
行执行相同操作这就是您想要的:

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

您不能嵌套
[]
。这实际上是将嵌套的括号解释为参数,并打印出一个错误,即您有太多的错误

这就行了

if [ "$yn" = "y" -o "$yn" = "Y" ]; then
另一种使用双括号和相同逻辑的替代语法

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

应该是

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

因此,它只会尝试删除常规文件(除非您重写了
rm
,并且您可以决定如何处理符号链接,否则您将得到dir的错误)。而
ls
则完全是无关的。

@WilliamOliver:因为您的语法不正确。它应该是:
[“$yn”='y'-o“$yn='y']
@mrjink不在Bash中conditionals@WilliamOliver:不,那不是真的。你可以使用
[[和]]
无论你在哪里使用
[和]
[
实际上是一个单独的二进制文件,
[[
是BASH的内部结构,所以性能方面的
[[和]]
会更好。更具体地说,
[
是一个命令名,而不是用于分组的语法,因此您不能像尝试的那样嵌套它们。有没有办法在Bash中嵌套条件?@WilliamOliver据我所知不太可能,但我想不出会有问题的情况。只需使用和/或及其各自的符号,或者嵌套带有条件的块。“嵌套条件”没有什么意义。我认为你在寻找分组,这可以用括号来完成:
如果[[($yn=“y”)\124;($yn=“y”)];那么
。但是,因为
[
是一个常规命令,如果你使用它而不是
[
,你必须转义括号:
如果[\($yn=“y”)-o\($yn=“y”)-y\)];然后
for i in *; do
  [ -f "$i" ] && rm $i
done