对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" )