将shell命令传递给bash函数并执行它们



我需要将多个shell命令传递给bash函数并按顺序执行。

我做过这样的事情:

wloop () 
{( 
for i in ~/someFolder/*;
do
pushd $i
echo "$($@)";
popd
done 
)}

并尝试调用像wloop 'cmd1'这样的函数,这是有效的,但在尝试提供像wloop 'cmd1; cmd2'这样的多个cmd时,不起作用

我将定义一个第二个函数,并将其名称传递给wloop

do_this () {
cmd1
cmd2
}
do_that () {
cmd3
}
wloop () {
for i in ~/someFolder/*; do
pushd "$i"
"$1"
popd
done
}
wloop do_this
wloop do_that

您想按顺序执行提供给shell的命令行参数吗?

我会这样做:

echo loop on $# arguments, executing each of them in sequence
while [ "$1" != "" ] ; do
eval "$1"
shift
done

上面的脚本,当用那行调用时:

bash essai.sh 'var=1' 'echo hello' 'echo world' 'echo var=$var'

产生以下输出:

loop on 4 arguments, executing each of them in sequence
hello
world
var=1

同样的事情也可以用一个函数来完成:

function wloop() {
while [ "$1" != "" ] ; do
eval $1
shift
done
}
wloop 'var=1' 'echo hello' 'echo world' 'echo $var'

附加说明:如果我们使用shift,您的命令行参数只能执行一次(因为在所有shifts之后,参数列表将"耗尽"。因此,如果您想多次运行此命令序列(就像您在*.txt上的循环在示例中建议的那样(,应该将命令行参数复制到数组中,而不是使用shift:

function wloop() {
args=("$@")
for file in *.txt ; do 
for i in $(seq 1 $#) ; do
eval "${args[$i]}"
done
done
}

正如Gordon Davisson在下面的评论所指出的;eval";命令容易产生错误。。它接受您提供给它的字符串,并将其作为一个命令执行而不加区分。所以,小心你对它的要求…

相关内容

  • 没有找到相关文章

最新更新