是否可以在飞行中连接变量并在结果上进行字符串替换?

时间:2012-12-17 15:31:40

标签: bash string-concatenation substitution

使用单个变量替换字符串:

FOO=fooo
echo ${FOO%o}

此输出为:foo

如何使用连接执行此操作?像这样:

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

此输出是(我的愿望):fooofoo

如果可以的话。


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

2 个答案:

答案 0 :(得分:2)

据我所知,没有办法像单一的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

如果你可以分享你想要达到的目标,或许有更优雅的解决方案。

答案 1 :(得分:0)

根据您正在寻找的内容,请参阅下面的两个可能的答案:

回答#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