【问题标题】:Can I pass an arbitrary block of commands to a bash function?我可以将任意命令块传递给 bash 函数吗?
【发布时间】:2010-09-11 11:34:20
【问题描述】:

我正在编写一个 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”,但我不知道这是如何实现的(或者是否可能)......有人有什么想法吗?

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

【问题讨论】:

    标签: bash


    【解决方案1】:

    这对大多数 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 脚本一样,它是在我喝了几杯啤酒时编写的;-)

    【讨论】:

    • 那行不通,我已经向用户输出指示它是否已完成,我想保留它...该功能的重点是摆脱所有样板,如果,回到内联它会使脚本再次膨胀到超出我想要的范围。
    • 我写的函数实际上有点不同(我在上面改变了它),但是我在 if 和 else 条件下都做了一些事情(我抽象出来了)......另外,观众是不是系统管理员/bash 脚本编写者……是对函数感到满意的程序员。
    • 我想我明白你现在需要什么了。这实际上是我的许多脚本的样子。再次更新它:-)
    • 添加了一个“真正的”单行版本,它将从函数内部评估代码​​。听说过“bash-coma”吗?这是在激烈的脚本会话之后发生的情况,当您开始相信每个问题都可以通过一个好的 bash 脚本来解决时。女朋友脾气暴躁?我可以解决这个问题。 :-)
    【解决方案2】:

    一种(可能是破解)解决方案是将单独的函数完全存储为单独的脚本。

    【讨论】:

    • 对不起,这些函数都太小了,我正在尝试将它合并到 1 行,所以所有需要调用的都在同一个地方。
    【解决方案3】:

    规范的答案:

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

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

    function file-exists {
        [ "$1" ] && [ -f $1 ]
    }
    
    file-exists $filename && echo "It has worked"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-05
      • 2011-09-15
      • 2021-04-30
      • 2018-02-13
      • 1970-01-01
      • 2013-10-08
      • 1970-01-01
      相关资源
      最近更新 更多