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

ber*_*roe 6 bash shell

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

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

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

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

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


这是关于 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
Run Code Online (Sandbox Code Playgroud)

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

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

$ TIME=${MYVAR:11}
$ echo ${TIME%:*}
    15:55
Run Code Online (Sandbox Code Playgroud)

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

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

echo ${`${MYVAR:11}`%:*}     # ERROR
Run Code Online (Sandbox Code Playgroud)

优点是您可以完全省略分配MYVARTIME,并使用字符串 or $(date)(或 a 的输出grep等)代替它。

gho*_*oti 4

首先,如果您确实尝试解析date,您应该知道您可以从 date 命令本身精确获取所需的日期格式:

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

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

也就是说,您不一定需要使用该date命令在 bash 中获取日期。如果您的 bash 版本是 4+,您可以使用printf日期格式而无需生成外部工具:

$ read year month day < <(printf '%(%Y %m %d)T')
Run Code Online (Sandbox Code Playgroud)

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

$ foo="Hello world."
$ foo="${foo//l/}"; echo "$foo"
Heo word.
$ foo="${foo:4}"; echo "$foo"
word.
Run Code Online (Sandbox Code Playgroud)