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 に答える