我想知道我的代码哪里出错了

我想知道我的代码哪里出错了

代码

removeapp(){
hi=1
while 'expr ${hi] <= $#'; do {
c="${c} $(${hi})"
hi='
}
sudo rm -rf '/applications/$c.app'
}

这是删除任何应用程序的代码。
其思路是 $c 将参数添加到一个变量中,因此是一个文本字符串。

我做错了什么?

答案1

我发现一些值得怀疑的事情:

  1. 第 3 行${hi]似乎不正确。您可能想要一个右花括号,而不是方括号。

  2. $hi在第 4 行,您正在子 shell 中执行 的值。$hi当前扩展为1,因此您尝试1在子 shell 中执行命令,并使用其标准输出。嗯,1不是大多数 shell 都能识别的命令,所以这可能不是您想要做的。

  3. 在第 5 行,您启动一​​个单引号字符串但将其保持打开,这可能不是您想要做的。

  4. 在第 7 行,您有$c一个单引号字符串,因此它不会被扩展;它只会保留为文字$c。这可能不是您想要做的。

答案2

除了 Spiff 的回答之外,还有几点:

  1. 关键字while后面应该跟一个普通命令。  'ls -l'并且 (输入'grep somename /etc/passwd'引号)不起作用; 也不起作用'expr ${hi] <= $#'。省略引号。
  2. 除非您使用的是某些非常老旧的 shell,否则您不需要使用它expr来进行简单的比较。只需使用 shell 的[...]构造即可。(但您需要更改测试的语法。)
  3. 你不需要使用{}来界定循环。(你使用它们,但在这里您不需要。)但是,当您使用时while,您必须以 开始循环do并以 结束循环 done
  4. 你正在c根据自身进行设置。这没问题,但你从未初始化过它。你可以将其添加到先前设置的值。
  5. $(${hi})引用位置参数的语法是错误的。
  6. 要“加总”所有参数,您不需要进行那么多工作;只需说c="$*"
  7. 但你的整个方法都是错的。如果你把所有事情都解决了,然后你说,
    removeapp dog elk fox
    
    它会做
    sudo rm -rf "/applications/dog elk fox.app"
    
    这不是你想要的。从头到尾思考你的问题。
  8. 请适当缩进您的代码。

相关内容