对Bash

时间:2015-10-15 01:36:36

标签: 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 -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就没有了。

这是输出。

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

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

2 个答案:

答案 0 :(得分:2)

变化:

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

while read -n 1 ch; do 
  #...
done <<<"$chmod_param"

或更一般地说:

while read -n 1 ch; do 
   #...
done < <( echo -n "$chmod_param" )

防止子shell创建导致while循环的管道结果。

答案 1 :(得分:1)

我之前看到过这样的行为,这是由于bash中的某些构造创建了一个新的上下文。基本上任何创建另一个shell的东西,比如反引号运算符或$()运算符都有自己的上下文。在你的情况下,我认为它可能是由echo提供的while循环。