我可以在多行命令中使用$...语法吗?

问题描述

我经常在长命令中使用反引号,为了便于阅读,我将它们与反斜杠换行符分开。当我用$( ... )语法替换反引号时,会出现错误

例如,我在反引号内使用curljq设置了一个变量(从我的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