【问题标题】:Nested commands in bashbash 中的嵌套命令
【发布时间】:2014-04-05 00:36:48
【问题描述】:

我一直试图在开始和结束时截断文件名。 我可以使用以下代码实现这一点:

#!bin/bash

FILENAME="hello123.txt"
NAME=${FILENAME%.t*}
NUMBER=${NAME:5}

DOESNTWORK=${${FILENAME%.t*}:5}

echo "$FILENAME"
echo "$NAME"
echo "$NUMBER"
echo "$DOESNTWORK"

我的问题在于 DOESNTWORK 行。
我收到以下错误: ma​​in.sh: line 7: ${"${FILENAME%.t*}":5}: bad substitution

有人可以指出行中的错误吗?

谢谢,

【问题讨论】:

  • 错误是bash不支持嵌套替换。
  • 感谢您的回复!有没有办法我可以用单行命令做我想做的事情?
  • 如果你使用zsh就可以!
  • tr -dc '[:digit:]' <<< "${FILENAME}"? echo "${FILENAME//[^0-9]/}? echo "${FILENAME:5:3}"?

标签: bash command nested


【解决方案1】:

在bash 中有(至少)两种方法可以实现这一点,至少对于您具体引用的示例而言。第一个删除所有不是数字的字符:

echo "${FILENAME//[^0-9]/}"

第二个是通过请求一个您已经部分使用的特定子字符串:

echo "${FILENAME:5:3}"

如果这些对您最有用,取决于您的实际用例与您引用的示例的比较...

【讨论】:

    【解决方案2】:

    如果你可以使用 GNU grep 为什么不在下面使用:

    DOESNTWORK=$(grep -o -E '[[:digit:]]+' <<< "$FILENAME")
    

    或使用 sed:

    DOESNTWORK=$(sed 's/[^0-9]*//g' <<< "$FILENAME")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-02
      • 2015-01-16
      • 1970-01-01
      • 2017-10-12
      • 1970-01-01
      • 1970-01-01
      • 2021-04-01
      • 1970-01-01
      相关资源
      最近更新 更多