2008-09-19 56 views
3

我正在处理一个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或更多)直接以干净的方式传递给“条件做”,但我不知道这是可行的(或甚至可能)。有没有人有任何想法?

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

回答

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..." 

我不喜欢这种解决方案虽然,因为你最终会落得这样做escapi ng的命令字符串。

编辑:将“eval $ *”更改为$ *。实际上,Eval不是必需的。由于是的bash脚本常见的,当我有一对夫妇啤酒;-)

+0

这将无法正常工作,我向用户输出了是否已完成,我想要保留的内容......该函数的重点在于如果要重新设置内联函数,则会删除所有样板文件再次膨胀剧本超出我想要的。 – 2008-09-19 22:01:47

0

一个(可能破解)解决方案是将各个功能作为单独的脚本一起存储。

+0

对不起,功能都waaaaay太小,我试图合并到1行,所有需要调用是在同一个地方。 – 2008-09-19 21:59:58

0

的cannonical答案这是写:

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

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

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

file-exists $filename && echo "It has worked" 
相关问题