1

我的脚本中有这个小片段:

    scriptVars="ProjectEnvironment ProjectType Project SubProject sshUser"
    for scriptVar in $scriptVars
    do
        # Transform all uppercase letters into lowercase
        $scriptVar=${!scriptVar,,}
    done
    echo $ProjectEnvironment

我试图在变量上只强制使用小写字符。唉,它不允许我执行此操作 - 它错误地认为它不是命令。我的猜测是因为我在一个循环中,它有点像一个局部变量,只在循环内。

反正有没有设置它,所以它会工作?

这可能很明显,但值得一提的是,变量是由用户提示的。

编辑 3.11.12

我最终使用了这个,通过使用@chepner 回答:

    scriptVars="ProjectEnvironment ProjectType Project SubProject sshUser"
    for scriptVar in $scriptVars
    do
        [[ -n `echo ${!scriptVar} | tr -d "[:lower:][:digit:]-"` ]] &&
        declare "$scriptVar=${!scriptVar,,}"
    done
    echo $ProjectEnvironment

变量中只允许使用字母数字和破折号(我之前对此进行了完整性检查),因此只有当变量具有大写字母时,它才会重新声明它。

4

1 回答 1

1

间接法只适用于赋值的右侧,而不是左侧。您还必须使用declare关键字。

scriptVars="ProjectEnvironment ProjectType Project SubProject sshUser"
for scriptVar in $scriptVars
do
    # Transform all uppercase letters into lowercase
    declare "$scriptVar=${!scriptVar,,}"
done
echo $ProjectEnvironment

另一种方法是使用适当的数组,因为您可以一次对所有元素应用扩展而无需显式循环。

values=( "$ProjectEnvironment" "$ProjectType" "$Project" "$SubProject" "$sshUser" )
values=( "${values[@],,}" )
ProjectEnvironment=${values[0]}
ProjectType=${values[1]}
# etc.
于 2012-11-03T17:34:51.580 回答