我有两个内置命令的bash字符串可以独立工作,但无论我尝试什么,嵌套时都会产生错误信息。以下是两个有效的命令:
$ A="etc/.java"
$ echo $A
/etc/.java
$ B="${A//$'\057\056'/$'\057'}"
$ echo $B
/etc/java
$ B="${A^^}"
$ echo $B
/ETC/.JAVA
现在尝试将两个命令组合在一起我得到错误:
$ B="${${A^^}//$'\057\056'/$'\057'}"
bash: ${${A^^}///.//}: bad substitution
$ B="${ ${A^^}//$'\057\056'/$'\057'}"
bash: ${ ${A^^}///.//}: bad substitution
$ B="${ ${A^^} //$'\057\056'/$'\057'}"
bash: ${ ${A^^} ///.//}: bad substitution
$ B="${"${A^^}"//$'\057\056'/$'\057'}"
bash: ${"${A^^}"//'/.'/'/'}: bad substitution
$ B="${ "${A^^}" //$'\057\056'/$'\057'}"
bash: ${ "${A^^}" //'/.'/'/'}: bad substitution
$ B="${${A^^} //$'\057\056'/$'\057'}"
bash: ${${A^^} ///.//}: bad substitution
上面给出了简化示例,因此可以复制并粘贴到自己的终端。管道或重定向会很复杂,因为我的真实世界代码是:
while [[ $i -lt $DirsArrCnt ]] ; do
DirsArr[$i]=false
CurrNdx=$i
CurrKey="${DirsArr[$(( $i + 1 ))]}"
# ^^ = convert to upper-case
# ${Variable//$'\041\056'/$'\041'} = Change /. to / for hidden directory sorting
if [[ "${"${CurrKey^^}"//$'\041\056'/$'\041'}" > \
"${"${LastKey^^}"//$'\041\056'/$'\041'}" ]] || \
[[ "${"${CurrKey^^}"//$'\041\056'/$'\041'}" = \
"${"${LastKey^^}"//$'\041\056'/$'\041'}" ]] ; then
LastNdx=$CurrNdx
LastKey="$CurrKey"
i=$(( $i + $OneDirArrCnt))
continue
fi
答案 0 :(得分:2)
在其中一个扩展为大套管的特殊情况下,可以使用declare -u
(在Bash 4.0中引入)在单个扩展中完成。 declare -u
在转让时会转换为大写。
组合上部套管和替换然后成为:
$ declare -u A='/etc/.java'
$ echo "${A//\/./\/}"
/ETC/JAVA
对于下部套管有类似的-l
,对于标题套管有(未记录的)-c
,但这些是您可以执行"嵌套"的唯一情况。参数扩展。