如何在Bash中为大写和替换嵌套参数扩展?

时间:2017-04-29 00:14:40

标签: bash replace uppercase

我有两个内置命令的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

1 个答案:

答案 0 :(得分:2)

在其中一个扩展为大套管的特殊情况下,可以使用declare -u(在Bash 4.0中引入)在单个扩展中完成。 declare -u在转让时会转换为大写。

组合上部套管和替换然后成为:

$ declare -u A='/etc/.java'
$ echo "${A//\/./\/}"
/ETC/JAVA

对于下部套管有类似的-l,对于标题套管有(未记录的)-c,但这些是您可以执行"嵌套"的唯一情况。参数扩展。