代码
removeapp(){
hi=1
while 'expr ${hi] <= $#'; do {
c="${c} $(${hi})"
hi='
}
sudo rm -rf '/applications/$c.app'
}
这是删除任何应用程序的代码。
其思路是 $c 将参数添加到一个变量中,因此是一个文本字符串。
我做错了什么?
答案1
我发现一些值得怀疑的事情:
第 3 行
${hi]
似乎不正确。您可能想要一个右花括号,而不是方括号。$hi
在第 4 行,您正在子 shell 中执行 的值。$hi
当前扩展为1
,因此您尝试1
在子 shell 中执行命令,并使用其标准输出。嗯,1
不是大多数 shell 都能识别的命令,所以这可能不是您想要做的。在第 5 行,您启动一个单引号字符串但将其保持打开,这可能不是您想要做的。
在第 7 行,您有
$c
一个单引号字符串,因此它不会被扩展;它只会保留为文字$c
。这可能不是您想要做的。
答案2
除了 Spiff 的回答之外,还有几点:
- 关键字
while
后面应该跟一个普通命令。'ls -l'
并且 (输入'grep somename /etc/passwd'
和引号)不起作用; 也不起作用'expr ${hi] <= $#'
。省略引号。 - 除非您使用的是某些非常老旧的 shell,否则您不需要使用它
expr
来进行简单的比较。只需使用 shell 的[
...]
构造即可。(但您需要更改测试的语法。) - 你不需要使用
{
和}
来界定循环。(你能使用它们,但在这里您不需要。)但是,当您使用时while
,您必须以 开始循环do
并以 结束循环done
。 - 你正在
c
根据自身进行设置。这没问题,但你从未初始化过它。你可以将其添加到先前设置的值。 $(${hi})
引用位置参数的语法是错误的。- 要“加总”所有参数,您不需要进行那么多工作;只需说
c="$*"
。 - 但你的整个方法都是错的。如果你把所有事情都解决了,然后你说,
它会做removeapp dog elk fox
这不是你想要的。从头到尾思考你的问题。sudo rm -rf "/applications/dog elk fox.app"
- 请适当缩进您的代码。