Bash子串和参数扩展而不分配给变量

时间:2013-10-20 23:01:18

标签: bash shell

更新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

优势在于您可以完全分配MYVARTIME,并使用字符串或$(date)(或grep的输出等)取而代之。

2 个答案:

答案 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.