我一直在努力解决这个问题,但我目前的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)
有没有更简洁的方法将这两个命令链接在一起?我的重构方法看起来很乱。
答案 0 :(得分:3)
假设CV
和UNTRIMMED_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
然后作为作业处理。