【发布时间】: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 表中较低,这意味着带有-的目录名称排序低于带有/路径分隔符的子目录.谢谢你说它是不可能嵌套的。如果您想发布一个显示在两者之间设置中间变量的答案,我会接受并投票。 -
很确定这实际上是重复的,让我在回答之前检查一下;)
-
我在发帖前搜索了一个现有的问答......但我在搜索方面遇到了挑战,所以它可能在那里。