我可以将任意的命令块传递给bash函数吗?
问题描述:
我正在处理一个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或更多)直接以干净的方式传递给“条件做”,但我不知道这是可行的(或甚至可能)。有没有人有任何想法?
请注意,我需要它是一个可读的解决方案...否则我宁愿坚持我拥有的。
答
这应该是可读的大多数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
对不起,功能都waaaaay太小,我试图合并到1行,所有需要调用是在同一个地方。 – 2008-09-19 21:59:58
答
的cannonical答案这是写:
[ -f $filename ] && echo "it has worked!"
,或者你可以把它包起来,如果你真的想:
function file-exists {
[ "$1" ] && [ -f $1 ]
}
file-exists $filename && echo "It has worked"
这将无法正常工作,我向用户输出了是否已完成,我想要保留的内容......该函数的重点在于如果要重新设置内联函数,则会删除所有样板文件再次膨胀剧本超出我想要的。 – 2008-09-19 22:01:47