我可以将任意命令块传递给bash函数吗?

时间:2008-09-19 21:54:35

标签: bash

我正在处理一个bash脚本,如果存在特定文件,我需要有条件地执行某些操作。这种情况多次发生,因此我抽象了以下函数:

function conditional-do {
    if [ -f $1 ]
    then
        echo "Doing stuff"
        $2
    else
        echo "File doesn't exist!"
    end
}

现在,当我想执行此操作时,我会执行以下操作:

function exec-stuff {
    echo "do some command"
    echo "do another command"
}
conditional-do /path/to/file exec-stuff

问题是,我很困扰我正在定义两件事:执行一组命令的功能,然后调用我的第一个函数。

我想以干净的方式将这个命令块(通常是2个或更多)直接传递给“conditional-do”,但我不知道这是如何可行的(或者如果它是可能的话)......有没有人有任何想法?

注意,我需要它是一个可读的解决方案......否则我宁愿坚持我所拥有的。

3 个答案:

答案 0 :(得分:4)

对于大多数C程序员来说,这应该是可读的:

function file_exists {
  if ( [ -e $1 ] ) then 
    echo "Doing stuff"
  else
    echo "File $1 doesn't exist" 
    false
  fi
}

file_exists filename && (
  echo "Do your stuff..."
)

或单行

file_exists filename && echo "Do your stuff..."

现在,如果您真的希望从该函数运行代码,那么您可以这样做:

function file_exists {
  if ( [ -e $1 ] ) then 
    echo "Doing stuff"
    shift
    $*
  else
    echo "File $1 doesn't exist" 
    false
  fi
}

file_exists filename echo "Do your stuff..."

我不喜欢那个解决方案,因为你最终会最终逃脱命令字符串。

编辑:将“eval $ *”更改为$ *。实际上,不需要Eval。与bash脚本一样,它是在我喝过几杯啤酒时写的; - )

答案 1 :(得分:0)

一个(可能是黑客)解决方案是将单独的函数一起存储为单独的脚本。

答案 2 :(得分:0)

回答:

[ -f $filename ] && echo "it has worked!"

或者你可以把它包起来,如果你真的想:

function file-exists {
    [ "$1" ] && [ -f $1 ]
}

file-exists $filename && echo "It has worked"