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

Mik*_*one 6 bash

我正在使用bash脚本,如果存在特定文件,则需要有条件地执行一些操作。这是多次发生,所以我抽象了以下函数:

function conditional-do {
    if [ -f $1 ]
    then
        echo "Doing stuff"
        $2
    else
        echo "File doesn't exist!"
    end
}
Run Code Online (Sandbox Code Playgroud)

现在,当我要执行此操作时,我将执行以下操作:

function exec-stuff {
    echo "do some command"
    echo "do another command"
}
conditional-do /path/to/file exec-stuff
Run Code Online (Sandbox Code Playgroud)

问题是,我烦恼的是我要定义两件事:一组要执行的命令的功能,然后调用我的第一个功能。

我想以一种干净的方式直接将此命令块(通常是2个或更多)传递给“条件执行”,但是我不知道这是如何可行的(或者甚至是可能的)...有人吗?有任何想法吗?

请注意,我需要将其作为可读的解决方案...否则,我宁愿坚持使用现有的东西。

Lud*_*rin 5

对于大多数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..."
)
Run Code Online (Sandbox Code Playgroud)

或单线

file_exists filename && echo "Do your stuff..."
Run Code Online (Sandbox Code Playgroud)

现在,如果您确实希望从该函数运行代码,则可以这样做:

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..."
Run Code Online (Sandbox Code Playgroud)

但我不喜欢这种解决方案,因为您最终将最终转义命令字符串。

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