传递带空格的命令作为函数参数

3

我有一个函数,它检查前一个命令的退出状态,并且如果不是0(成功),则应该运行多个命令。

revert()
{
if [ $? -ne 0 ]
then
  echo $#
  for c in $@
  do
    Execute command contained in passed string
  done
  echo "Operation failed. Reverting..."
  exit 1
fi
}

我尝试调用这个函数,然后得到了这个输出:
revert "ls" "ls -la"
2
ls ls -la
auten.py  canReach.sh  chpass.sh  newUser.sh  popo  secdir.sh
auten.py  canReach.sh  chpass.sh  newUser.sh  popo  secdir.sh
No command '-la' found, did you mean:
 Command 'tla' from package 'tla' (universe)
-la: command not found

显然,空间是问题所在。我在这个页面上尝试了许多解决方案,但得到的结果都是相同的,只有一个巨大的头痛。
因此,在回复之前,请尝试我的函数并查看是否可以获得所需的输出。谢谢。


如果其中一个命令实际上应该包含空格怎么办?也许你想要一些元语法,就像find命令为命令所做的那样:revert ls \; ls -la - Eevee
1个回答

3
使用带引号的 "$@",然后使用 eval "$c" 执行命令。
revert()
{
    (( $? == 0 )) && return 0

    for c in "$@"
    do
        eval "$c"
    done

    echo "Operation failed. Reverting..." >&2
    exit 1
}

您可以将x && y理解为“如果x,则y”。这是一种常见的脚本简写方式。第一行代码的含义等同于:
if (( $? == 0 )); then return 0; fi

谢谢,回答得非常快也很清晰。您能解释一下这行代码 (( $? )) || return 0 吗?看起来像是一个或运算。 - Pavol Hanzel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接