Linux 如何将带引号的字符串作为参数传递给bash中的函数?

Linux 如何将带引号的字符串作为参数传递给bash中的函数?,linux,bash,shell,unix,Linux,Bash,Shell,Unix,我有一个简单的bash函数,其目标是运行作为字符串传入的命令,检查$?中的返回代码,如果返回非零,则打印第二个参数中指定的错误并退出 下面是函数: function checkcommand() { $1 if [ "$?" -ne "0" ]; then echo "$2" exit 1 fi } 这个功能非常有效。以下是一些有效的示例: checkcommand "git clone /home/git/framework.git $

我有一个简单的bash函数,其目标是运行作为字符串传入的命令,检查$?中的返回代码,如果返回非零,则打印第二个参数中指定的错误并退出

下面是函数:

function checkcommand()
{
    $1
    if [ "$?" -ne "0" ]; then
        echo "$2"
        exit 1
    fi
}
这个功能非常有效。以下是一些有效的示例:

checkcommand "git clone /home/git/framework.git $gitreponame" "git clone failed!
"
当我想使用我的函数验证提交是否成功时,就会出现问题:

checkcommand "git commit -m\"remove migrations from release-$todaysrelease-pr
ep\"" "Commit for migrations removal from release-$todaysrelease-prep failed!" 
我尝试过(如图所示)baclslash引用、单引号、各种单引号和双引号组合,等等

谢谢你的提示

试试看

function checkcommand()
{
    eval $1
    if [ "$?" -ne "0" ]; then
        echo "$2"
        exit 1
    fi
}

在您的命令中使用
\
之前的
”,就像您在示例中所做的那样。

将单词列表保留为单词列表;不要将它们引用到一个单词中,只是为了以后将其展开:eval是邪恶的

典型的
die
函数是一种更简单、可读性更强的习惯用法:

die() {
  echo "$*" >&2
  exit 1
}

git commit -m"remove migrations from release-$todaysrelease-prep" ||
  die "Commit for migrations removal from release-$todaysrelease-prep failed!"

你使用的是哪个版本的bash/sh/随便什么?它在GNU bash 3.2.48(1)版(x86_64-apple-darwin11)和GNU bash 4.1.5(1)版(x86_64-pc-linux-GNU)下工作,非常好,谢谢!我知道eval,但没有想过在这种情况下使用它。你能解释一下“eval是邪恶的”是什么意思吗,特别是在这种情况下?@feoh对于您的示例checkcommand“git clone/home/git/framework.git$gitreponame”,如果gitreponame=“;rm-rf.git”?@MarkEdgar响应稍晚,会发生什么情况,但如果您没有阅读问题,则需要将命令作为字符串传递,这意味着该命令可以是任何内容。您建议如何在不使用
eval
的情况下将字符串作为命令运行(如果确实是这样的话)。