我需要将多个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";命令容易产生错误。。它接受您提供给它的字符串,并将其作为一个命令执行而不加区分。所以,小心你对它的要求…