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

Pass in shell commands to bash function and execute them

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

我做过这样的事情:

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

并尝试调用如下函数:wloop 'cmd1' 这有效,但尝试提供多个 cmd,如 wloop 'cmd1; cmd2' 无效

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

我会这样做:

echo loop on $# arguments, executing each of them in sequence
while [ "" != "" ] ; do
        eval ""
        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 [ "" != "" ] ; do
        eval 
        shift
    done
    }

wloop 'var=1' 'echo hello' 'echo world' 'echo $var'

附加说明:如果我们使用 shift,您的命令行参数只能执行一次(毕竟 shift s 参数列表将是 'exhausted'。所以,如果你想 运行 这个命令序列多次(就像你在 *.txt 上的循环在你的例子中建议的那样),你应该复制命令行将参数放入数组而不是使用 shift:

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

正如下面的评论 Gordon Davisson 所指出的,“eval”命令容易产生错误。它接受您提供给它的字符串并将其作为命令执行,没有任何区别。所以,小心你的要求...

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

do_this () {
    cmd1
    cmd2
}

do_that () {
    cmd3
}

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

wloop do_this
wloop do_that