问题描述
我经常在长命令中使用反引号,为了便于阅读,我将它们与反斜杠换行符分开。当我用$( ... )
语法替换反引号时,会出现错误。
例如,我在反引号内使用curl
和jq
设置了一个变量(从我的Trello每日待办事项列表中读取,并为除特定卡之外的所有内容返回card.id和card.name) :
AllCardsInDTL=\
`\
curl -s "https://api.trello.com/1/lists/$DailyTasksListID/cards\
?$WhoMe\
&fields=name,id,pos\
"\
| jq '\
.[] | \
if .name | test ("Tasks here are copied.*") \
then empty \
else .id,.name \
end \
'\
` # End of AllCardsInDTL=
没问题,shell变量由ID和Name值的交替行组成。
但是,如果我将反引号替换为$( ... )
,则会收到jq
的错误消息:
jq: error: Syntax error,unexpected INVALID_CHaraCTER,expecting $end (Unix shell quoting issues?) at <top-level>,line 1:
\
jq: 1 compile error
(23) Failed writing body
从错误中我还不清楚,)
是否实际上没有终止由$(
开始的命令,或者在$( ... )
内是否未按我的预期解释反斜杠
我希望能够使用$( ... )
语法,因为有时候我想将一个子shell嵌套在另一个子shell中,而用反引号很难做到这一点。
解决方法
您当然可以使用\
来转义$(...)
表达式内的行尾。还要注意,您不需要在单引号内的\
表达式中使用那些jq
。
我可能会这样写:
AllCardsInDTL=$(
curl -s "https://api.trello.com/1/lists/$DailyTasksListID/cards\
?$WhoMe\
&fields=name,id,pos" |
jq '.[] |
if .name | test ("Tasks here are copied.*")
then empty
else .id,.name
end
'
)
我无法对此进行测试,因为我对$DailyTasksListID
没有任何有用的价值,目前我也没有资格向trello进行身份验证。
是的。演示:
echo $(echo foo
echo bar
echo baz
)
输出:
foo bar baz