Bash 使用函数时不输入if条件

Bash 使用函数时不输入if条件,bash,shell,Bash,Shell,正在尝试将if条件作为find语句中的子shell运行函数。它只是进入另一部分。为什么? 不清楚哪些参数应该在哪里传递,但您当前的尝试肯定是错误的。调用时没有向func\u name传递任何参数,因此“$arg1”正在扩展为空字符串。我猜你想要像这样的东西 #!/bin/bash function func_name { arg1=$1; arg2=$2; if [[ "${arg1}" == "abcd" ]]; then echo enterd abcd condition

正在尝试将if条件作为find语句中的子shell运行函数。它只是进入另一部分。为什么?

不清楚哪些参数应该在哪里传递,但您当前的尝试肯定是错误的。调用时没有向
func\u name
传递任何参数,因此
“$arg1”
正在扩展为空字符串。我猜你想要像这样的东西

#!/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 {} \;
在这里,
func_name
被显式地赋予传递给原始脚本的参数。在
-c
的参数中不需要子shell,因为整个命令已经在单独的进程中运行

如果您使用的是
bash
4或更高版本,那么实际上可能不需要使用
find

find . -name "*" -type d -exec bash -c 'cd "$1" && func_name "$2" "$3"' {} "$1" "$2" \;

不清楚应该在哪里传递哪些参数,但您当前的尝试肯定是错误的。调用时没有向
func\u name
传递任何参数,因此
“$arg1”
正在扩展为空字符串。我猜你想要像这样的东西

#!/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 {} \;
在这里,
func_name
被显式地赋予传递给原始脚本的参数。在
-c
的参数中不需要子shell,因为整个命令已经在单独的进程中运行

如果您使用的是
bash
4或更高版本,那么实际上可能不需要使用
find

find . -name "*" -type d -exec bash -c 'cd "$1" && func_name "$2" "$3"' {} "$1" "$2" \;

函数块内的变量仅在调用函数时计算。如果要在函数声明时绑定某些变量,请使用
eval
,或一对全局变量

shopt -s globstar
for d in **/*/; do
    pushd "$d"
    func_name "$1" "$2"
    pops
done
如果后续代码从未更改全局变量
\u private\u foo
\u private\u bar
,则该函数将像将
$1
$2
的初始全局值插值到函数定义中一样工作,而不会出现
eval
的各种复杂情况和危险


如果您需要函数在子shell中工作,您还需要导出全局变量,或者以某种方式将它们传入,正如@chepner所指出的那样。

函数块中的变量只有在调用函数时才进行计算。如果要在函数声明时绑定某些变量,请使用
eval
,或一对全局变量

shopt -s globstar
for d in **/*/; do
    pushd "$d"
    func_name "$1" "$2"
    pops
done
如果后续代码从未更改全局变量
\u private\u foo
\u private\u bar
,则该函数将像将
$1
$2
的初始全局值插值到函数定义中一样工作,而不会出现
eval
的各种复杂情况和危险


如果您需要函数在子shell中工作,您还需要导出全局变量,或者以其他方式将它们传入,正如@chepner所指出的那样。

这一点很清楚,但是您希望并期望如何将它们传递到子shell中,至于函数,我甚至希望函数能够读取命令行参数。但是,chepner针对basah 4或更高版本的解决方案效果良好。但是我没有理解他给出的find语句解决方案的正确含义,
$1
等在函数中引用函数的参数,而不是脚本的参数。您必须显式地传递它们,首先传递给运行
find
的shell,然后传递给函数本身。你能解释一下吗?这是基本的。这一点很清楚,但是你到底希望并期望它们传递给子shell,然后传递给函数吗?我甚至希望命令行参数能够被函数读取。但是,chepner针对basah 4或更高版本的解决方案效果良好。但是我没有理解他给出的find语句解决方案的正确含义,
$1
等在函数中引用函数的参数,而不是脚本的参数。您必须显式地传递它们,首先传递给运行
find
的shell,然后传递给函数本身。你能解释一下吗?这是最基本的。你从来没有回答过要求澄清的问题,现在你又有了一个同样问题的问题。我们无法读懂你的思想,而不做你想做的事情的代码只会告诉我们你不想做的事情。你需要解释你想要完成什么,以及你认为这段代码将如何带你到达目的地;它会报告以
开头的隐藏名称和通常可见的名称。我通过单击Claudiom答案旁边的绿色复选标记,将其中一个答案标记为已接受。您在中从未回答过澄清请求,现在您又遇到了另一个具有相同问题的问题。我们无法读懂你的思想,而不做你想做的事情的代码只会告诉我们你不想做的事情。你需要解释你想要完成什么,以及你认为这段代码将如何带你到达目的地;它报告以
开头的隐藏名称和通常可见的名称。我通过单击Claudiom答案旁边的绿色复选标记将其中一个答案标记为已接受。不过,您必须导出
\u private\u foo
\u private\u bar
,如果由
find
启动的shell调用
func\u name
,因为shell使用动态范围。您必须导出
\u private\u foo
\u private\u bar
,但是如果由
find
启动的shell调用
func\u name
,因为shell使用动态范围。