对Bash中的变量作用域感到困惑

对Bash中的变量作用域感到困惑,bash,variables,unix,Bash,Variables,Unix,这是我在函数中的代码 function safeChmod_ProcessOctalModes() { local i=0 local targetpermission="" local chmod_param=$1 # local folder_chmod_param=`echo $chmod_param | fold -w1` # echo xxxxxxxxxxxx=$folder_chmod_param >/dev/tty echo -

这是我在函数中的代码

function safeChmod_ProcessOctalModes() {
    local i=0
    local targetpermission=""
    local chmod_param=$1
    # local folder_chmod_param=`echo $chmod_param | fold -w1`
    # echo xxxxxxxxxxxx=$folder_chmod_param >/dev/tty
    echo -n "$chmod_param" | \
    while read -n 1 ch;
    do
        if [ $i -eq 0 ]
        then
            i=$(( i+1 ))
            continue
        fi
        i=$(( i+1 ))

        if [ $ch -eq 0 ]
        then
            targetpermission=($targetpermission"---")
            echo tp=$targetpermission >/dev/tty
        elif [ $ch -eq 1 ]
        then
            targetpermission=($targetpermission"--x")
            echo tp=$targetpermission >/dev/tty
        elif [ $ch -eq 2 ]
        then
            targetpermission=($targetpermission"-w-")
            echo tp=$targetpermission >/dev/tty
        elif [ $ch -eq 3 ]
        then
            targetpermission=($targetpermission"-wx")
            echo tp=$targetpermission >/dev/tty
        elif [ $ch -eq 4 ]
        then
            targetpermission=($targetpermission"r--")
            echo tp=$targetpermission >/dev/tty
        elif [ $ch -eq 5 ]
        then
            targetpermission=($targetpermission"r-x")
            echo tp=$targetpermission >/dev/tty
        elif [ $ch -eq 6 ]
        then
            targetpermission=($targetpermission"rw-")
            echo tp=$targetpermission >/dev/tty
        elif [ $ch -eq 7 ]
        then
            targetpermission=($targetpermission"rwx")
            echo tp=$targetpermission >/dev/tty
        fi
    done 
    echo tp_in_func=$targetpermission >/dev/tty
    echo $targetpermission
    return 0;
}
在我进入while循环之前,
targetpermission
变量被正确填充。但是,循环完成后,
targetpermission
即为none

这是输出

chmod_param=0700
tp=rwx
tp=rwx---
tp=rwx------
tp_in_func=

为什么会这样?如何在while循环之外保留
targetpermission
变量的赋值?

我以前见过类似的行为,这是由于bash中的某些构造创建了一个新的上下文。基本上,任何创建另一个shell的操作,比如backtick操作符或$()操作符,都有自己的上下文。在您的情况下,我认为可能是由echo提供的while循环。

更改:

echo -n "$chmod_param" | \
while read -n 1 ch; do 
  #...
done
进入

读取时-n1ch;做
#...

完成如果将管道插入while循环,while循环将位于子shell中。管道
|
导致while循环作为并行进程执行,因此在while循环结束时丢失变量。您可以将其更改为
while(条件);做完成
while read -n 1 ch; do 
  #...
done <<<"$chmod_param"
while read -n 1 ch; do 
   #...
done < <( echo -n "$chmod_param" )