5

更新2:这个问题与这个问题有关,可能是因为这可能/可能不起作用的根本原因是相同的。但我不确定它是否实际上是重复的,因为嵌套只是如何在其中获取字符串的一个示例。同样的基本问题也可以改写为:

  • 有没有办法在参数扩展中直接使用字符串,可能使用expr
  • 将输出传递到参数扩展的最简洁方法是什么?

更多“假”语法示例来说明这些目标......

${$(echo "b"; b="ABCDE")::3}  #  Assign output inside?
... | grep -o "ABCDE" | ${-::2}   #  pipe to placeholder inside?

因此,根据您的目标,这可能是一个骗局,也可能不是。无论如何,从目前的答案来看,这种方法听起来无论如何都是不可能的......


这是一个关于 bash 操作的一般问题,而不是尝试获取特定的字符串 subser ...

我知道您可以使用参数扩展和其他技巧来提取或替换已定义变量的某些部分。

例如:

$ MYVAR=$(date)    # just to generate text; could be "ABCDE"
$ echo $MYVAR
Mon Oct 20 15:55:07 PDT 2014
$ echo ${MYVAR:11}
15:55:07 PDT 2014
$ echo ${MYVAR%:*}
Mon Oct 20 15:55

我想要的是一种在不创建中间变量的情况下“嵌套”这些操作的方法。

例如,当你这样做时你会得到什么:

$ TIME=${MYVAR:11}
$ echo ${TIME%:*}
    15:55

我希望能够将正在发生的操作嵌套在正在发生TIME的操作中MYVAR

想到的潜在语法类似于$()让您嵌套操作,但对变量执行此操作。它可能看起来像这样......(这是行不通的——我试过了!)

echo ${`${MYVAR:11}`%:*}     # ERROR

这样做的好处是您可以完全不用分配MYVARand ,而是TIME使用字符串 or $(date)(或 a 的输出grep等)代替它。

4

2 回答 2

2

您可以BASH arrays像这样使用和减少临时变量的创建:

$ MYVAR=($(date))
$ echo "${MYVAR[@]}"
Mon Oct 20 15:55:07 PDT 2014

# get 4th elements and substring in SINGLE operation 
$ echo "${MYVAR[3]%:*}"
15:55
于 2013-10-21T05:25:20.133 回答
2

首先,如果你真的想解析date,你应该知道你可以从 date 命令本身得到你想要的日期格式:

$ read year month day < <(date '+%Y %m %d')
$ echo "year=$year month=$month day=$day"
year=2013 month=10 day=20

如果您使用的是 Linux,man date请查看格式详细信息。在其他操作系统(FreeBSD、OSX 等)中,该date命令是该strftime()函数的包装器,因此您可以阅读其手册页

也就是说,您不一定需要使用该date命令来获取 bash 中的日期。如果您的 bash 版本是 4+,您可以printf在不产生外部工具的情况下为格式设置日期:

$ read year month day < <(printf '%(%Y %m %d)T')

但是要回答您的问题,您可以使用 zsh,但不能使用 bash、ksh 或其他 Bourne shell。处理此问题的标准方法是使用临时变量,但请注意,您可以回收现有变量。

$ foo="Hello world."
$ foo="${foo//l/}"; echo "$foo"
Heo word.
$ foo="${foo:4}"; echo "$foo"
word.
于 2013-10-20T23:42:25.963 回答