链接Bash语句

时间:2015-03-11 17:50:01

标签: bash

我一直在努力解决这个问题,但我目前的bash声明如下:

trim() {
    local var="$*"
    var="${var#"${var%%[![:space:]]*}"}"   # remove leading whitespace characters
    var="${var%"${var##*[![:space:]]}"}"   # remove trailing whitespace characters
    echo -n "$var"
}

CV=trim `$(cat somejson | grep '\"fdsaf\"' | sed 's/  "fasdf": "\(.*\)",/\1/')`

这失败了,因为我相信

$(cat somejson | grep '\"fdsaf\"' | sed 's/ "fasdf": "\(.*\)",/\1/')

被解释为bash命令并抛出错误。

相反,我将其重构为

CV=$(cat somejson | grep '\"dasf\"' | sed 's/  "fasd": "\(.*\)",/\1/')
NEW_CV=$(trim $UNTRIMMED_PROD_NAME)

有没有更简洁的方法将这两个命令链接在一起?我的重构方法看起来很乱。

1 个答案:

答案 0 :(得分:3)

假设CVUNTRIMMED_PROD_NAME是相同的变量(拼写错误),那么是的,只需嵌套$()位。

NEW_CV=$(trim $(grep '\"dasf\"' somejson | sed 's/  "fasd": "\(.*\)",/\1/'))

您的原始CV=trim `....`无法正常工作,因为您忘记了外部$(),并且shell认为它是:

在运行CV=trim命令输出结果的运行命令环境中设置cat somejson | grep '\"fdsaf\"' | sed 's/ "fasdf": "\(.*\)",/\1/'(是运行输出,是 2 执行死刑。)

CV=trim `$(cat somejson | grep '\"fdsaf\"' | sed 's/  "fasdf": "\(.*\)",/\1/')`

首先展开内部命令$()并获得结果并以

结束
CV=trim `cat-grep-sed-result`

然后展开反引号命令执行(作为命令的cat-grep-sed-result字符串),这可能会引发错误并导致一个空字符串,最后以

结束
CV=trim

然后作为作业处理。