【问题标题】:Is it possible to concatenate variables on fly and make string subsitution on the result?是否可以即时连接变量并对结果进行字符串替换?
【发布时间】:2012-12-17 15:31:39
【问题描述】:

用单个变量替换字符串:

FOO=fooo
echo ${FOO%o}

输出是:foo

如何通过串联来做到这一点?像这样的:

FOO=fooo
echo ${FOO$FOO%o}

输出是(我的愿望):fooofoo

如果这是可能的话。


换句话说,我想连接几个字符串(使用变量),然后将字符串替换应用于整个字符串(连接所有变量),而不仅仅是单个变量。

【问题讨论】:

  • 我不确定我是否理解这个问题。你能显示预期的输出吗?
  • @ShawnChin,我正在寻找一种将替换应用于连接的方法,您展示了连接替换字符串的代码。执行函数的顺序会有所不同。
  • 好的。现在我明白了。 AFAIK 没有办法将其作为单个 bash 操作来完成。您需要先连接到一个变量,然后是所需的参数替换
  • @ShawnChin,谢谢,这是一个坏消息,但无论如何,这似乎是一个答案(请将此作为答案发布,而不是评论)。至于你的问题——问题是它破坏了程序的工作流程。当您可以将连接放在另一个函数调用中时,它只会更具可读性,而不是仅仅为了创建另一个变量而停止(因为 bash 限制)。
  • 我已按照要求将其改写为答案。

标签: bash string-concatenation substitution


【解决方案1】:

据我所知,没有办法通过单一的 bash 操作来做到这一点。您需要先连接到一个变量,然后是所需的参数替换/扩展。

FOO=foooo
TMP=$FOO$FOO  # concatenation
echo "${TMP%o}"  # parameter substitution on concatenated string

如果您觉得额外的 var 分配使其可读性降低,您可以选择效率较低(但更容易识别)的方法,将输出传递到执行类似操作的另一个命令,例如:

[me@home]$ FOO="fooo"

[me@home]$ TMP=$FOO$FOO; echo ${TMP%o}  # bash only, with temp var
fooofoo

[me@home]]$ echo $FOO$FOO | sed 's/o$//'  # pipe to an equivalent operation
fooofoo

此外,根据您的最终目标,可能会有更简洁的方法来实现它。

例如,需要进行连接和修剪时的常见情况是用于路径操作,即:

[me@home]$ APP_ROOT=/opt/myapp
[me@home]$ APP_PATH=/config/hello.cfg
[me@home]$ FULL_PATH=$APP_ROOT$APP_PATH
[me@home]$ echo ${FULL_PATH%/hello.cfg}
/opt/myapp/config

在这种情况下,“更清洁”的方法是:

[me@home]$ dirname $APP_ROOT$APP_PATH
/opt/myapp/config

如果您可以分享您正在努力实现的目标,也许会有更优雅的解决方案。

【讨论】:

    【解决方案2】:

    请参阅下面的两个可能的答案,具体取决于您要查找的内容:

    答案#1:

    FOO=fooo
    echo "${FOO}${FOO%o}"
    

    输出:

    fooofoo
    

    答案#2:

    FOO=fooo
    echo "${FOO%o}${FOO%o}"
    

    输出:

    foofoo
    

    答案#3:

    FOO=fooo
    CONCAT="$FOO$FOO"
    echo "${CONCAT%ofooo}"
    
    foo
    

    【讨论】:

    • 谢谢,但上面的代码只是一个示例,你必须匹配整个字符串(连接后)而不仅仅是尾部。对于比尾巴长或短的模式,它是等价的,但对于比尾巴长的替换 - 不是。考虑${FOO$FOO%ofooo}。这应该给出“foo”,并且只有当您将字符串作为一个整体处理时才有可能。
    • @greenoldman 先将它们连接起来,然后进行替换有问题吗? (见更新的答案#3)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多