O problema está nas suas aspas duplas. Aqui você não precisa citar as chaves de hash como elas são identificadores simples . De perldoc perldata :
In fact, a simple identifier within such curlies is forced to be a string, and likewise within a hash subscript. Neither need quoting. Our earlier example,
$days{'Feb'}can be written as$days{Feb}and the quotes will be assumed automatically. But anything more complicated in the subscript will be interpreted as an expression. This means for example that$version{2.0}++is equivalent to$version{2}++, not to$version{'2.0'}++.
Então:
perl -le 'print crypt($ENV{PSWD},"\$$ENV{HVAL}\$$ENV{SVAL}\$")'
Se você está usando dentro de backticks, você precisa dobrar suas barras invertidas como em:
var='perl -le 'print crypt($ENV{PSWD},"\$$ENV{HVAL}\$$ENV{SVAL}\$")''
Melhor é usar a forma $(...) de substituição de comando:
var=$(perl -le 'print crypt($ENV{PSWD},"\$$ENV{HVAL}\$$ENV{SVAL}\$")')