更新2:此问题与this question有关,可能是因为这可能/可能不起作用的根本原因是相同的。但我不确定它是否实际上是重复的,因为嵌套只是如何在那里获取字符串的一个例子。同样的基本问题也可以改为:
expr
更多“假”语法的例子来说明这些目标...
${$(echo "b"; b="ABCDE")::3} # Assign output inside?
... | grep -o "ABCDE" | ${-::2} # pipe to placeholder inside?
因此,根据您的目标,它可能是一个骗局。 无论如何,从目前的答案来看,听起来这种方法无论如何都不可能......
这是关于bash操作的一般性问题,而不是试图获取特定的字符串子...
我知道您可以使用参数扩展和其他技巧来提取或替换已定义变量的部分。
例如:
$ 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
优势在于您可以完全分配MYVAR
和TIME
,并使用字符串或$(date)
(或grep
的输出等)取而代之。
答案 0 :(得分: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
答案 1 :(得分:1)
首先,如果你真的想解析 date ,你应该知道你可以从date命令本身准确地得到你想要的日期格式:
[ghoti@pc ~]$ read year month day < <(date '+%Y %m %d')
[ghoti@pc ~]$ echo "year=$year month=$month day=$day"
year=2013 month=10 day=20
如果您使用Linux man date
来格式化详细信息。在其他操作系统(FreeBSD,OSX等)中,date
命令是strftime()
的包装器,因此您可以阅读man page for that instead。
但要回答你的问题,你可以在zsh中,但不能在bash,ksh或其他Bourne shell中。处理此问题的标准方法是使用临时变量,但请注意,您可以回收现有变量。
[ghoti@pc ~]$ foo="Hello world."
[ghoti@pc ~]$ foo="${foo//l/}"; echo "$foo"
Heo word.
[ghoti@pc ~]$ foo="${foo:4}"; echo "$foo"
word.