【问题标题】:How do I nest parameter expansions for uppercasing and substitution in Bash?如何在 Bash 中为大写和替换嵌套参数扩展?
【发布时间】:2017-09-27 04:20:19
【问题描述】:

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

【问题讨论】:

  • 你不能像这样嵌套扩展。另一方面,"${A//\/.\/}" 不会比八进制转义更简单吗?
  • @BenjaminW。好吧,为了使示例更简单,我做了一点儿作弊,因为我必须将 / 重新映射到 !,因为 - 在 ASCII 表中较低,这意味着带有 - 的目录名称排序低于带有 / 路径分隔符的子目录.谢谢你说它是不可能嵌套的。如果您想发布一个显示在两者之间设置中间变量的答案,我会接受并投票。
  • 很确定这实际上是重复的,让我在回答之前检查一下;)
  • 我在发帖前搜索了一个现有的问答......但我在搜索方面遇到了挑战,所以它可能在那里。

标签: bash replace uppercase


【解决方案1】:

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

结合大写和替换然后变成这样:

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

类似的-l 用于小写,-c 用于标题大小写,但这些是您可以进行“嵌套”参数扩展的唯一情况。

【讨论】:

  • 像魅力一样工作:)。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-20
  • 1970-01-01
  • 1970-01-01
  • 2015-06-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多