#!/bin/bash
function func_name {
arg1=$1; arg2=$2;
if [[ "${arg1}" == "abcd" ]]; then
echo enterd abcd condition
else
echo entered else
fi
}
export -f func_name
find . -name "*" -type d -exec bash -c '( cd {} &&
func_name;
)' bash $1 $2 {} \;
试图运行具有if条件如发现语句中子shell的功能。 它只是进入别的部分。 为什么?
目前还不清楚哪些参数应传递哪里,但你目前的尝试肯定是错误的。 您没有传递任何参数来func_name
当你调用它,所以"$arg1"
扩大为空字符串。 我怀疑你想要的东西,像
find . -name "*" -type d -exec bash -c 'cd "$1" && func_name "$2" "$3"' {} "$1" "$2" \;
在这里, func_name
明确给出传递给原始脚本的参数。 你不需要子shell中的参数-c
,因为整个命令在一个单独的进程已经运行。
如果你正在使用bash
4或更高版本,你可能并不真正需要使用find
。
shopt -s globstar
for d in **/*/; do
pushd "$d"
func_name "$1" "$2"
pops
done
功能块内的变量时调用该函数时只进行评价。 如果你要绑定在函数声明时的一些变量,使用eval
,或者对全局变量。
#!/bin/bash
_private_foo=$1
_private_bar=$2
func_name {
if [[ "$_private_foo" == "abcd" ]]; then
echo entered abcd condition
else
echo entered else
fi
}
如果后面的代码永远不会改变的全局变量_private_foo
和_private_bar
,该功能将工作,如果初始全局值$1
和$2
被写进原函数的定义,没有无数的并发症的危险中eval
。
如果你需要的功能在一个子shell工作,你还需要export
的全局,或以某种方式以其他方式越过他们,正如@chepner指出。