将 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
我需要将多个 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