Code like ${!#} flags the "#" as shDerefWordError [1]; the "!prefix"
syntax region delegates to one of the shDerefSpecial handlers via
@shDerefList, but it misses the "#" case as valid for ${##} and ${!#}.
[1]: https://vi.stackexchange.com/q/48617/10604
Correct that. Indirection is only valid in Bash in Ksh, so rearrange the
"!" handling to be conditional.
closes: #20016
Helped-by: Christian Brabandt <cb@256bit.org>
Signed-off-by: D. Ben Knoble <ben.knoble+github@gmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
38 lines
1.1 KiB
Bash
38 lines
1.1 KiB
Bash
#!/bin/ksh
|
|
# Test variable modifiers
|
|
# Variable=value
|
|
Variable='value'
|
|
Variable="value"
|
|
VariableA="pat1xxpat2"
|
|
VariableB="pat2xxpat1"
|
|
echo ${#}
|
|
echo ${#VariableA}
|
|
echo ${VariableA#pat1}
|
|
echo ${VariableA##pat1}
|
|
echo ${VariableB%pat1}
|
|
echo ${VariableB%%pat1}
|
|
|
|
# This gets marked as an error
|
|
Variable=${VariableB:+${VariableC:=eng}} # :+ seems to work for ksh as well as bash
|
|
Variable=${VariableB:-${VariableC:-eng}} # :- is ksh and bash
|
|
|
|
# This is OK
|
|
Variable='${VariableB:+${VariableC:=eng}}'
|
|
Variable='${VariableB:-${VariableC:-eng}}'
|
|
Variable="${VariableB:+${VariableC:=eng}}" # :+ seems to work for ksh as well as bash
|
|
Variable="${VariableB:-${VariableC:-eng}}" # :- is ksh and bash
|
|
|
|
# These are OK
|
|
: ${VariableB:-${VariableC:-eng}}
|
|
: "${VariableB:-${VariableC:-eng}}"
|
|
: '${VariableB:-${VariableC:-eng}}'
|
|
|
|
# Another test
|
|
Variable=${VariableB:-${VariableC:-${VariableD:-${VariableE:=eng}}}}
|
|
: ${VariableB:=${VariableC:-${VariableD:-${VariableE:=eng}}}}
|
|
|
|
# special variables
|
|
echo "${!#}" # last positional argument
|
|
echo "${!@}" # deref
|
|
echo "${#PATH}" # length
|