使用功能时,如果条件不进入(not entering if condition when using

2019-10-29 22:20发布

#!/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的功能。 它只是进入别的部分。 为什么?

Answer 1:

目前还不清楚哪些参数应传递哪里,但你目前的尝试肯定是错误的。 您没有传递任何参数来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


Answer 2:

功能块内的变量时调用该函数时只进行评价。 如果你要绑定在函数声明时的一些变量,使用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指出。



文章来源: not entering if condition when using a function
标签: bash shell