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

Aug*_*ust 6 bash shell command-substitution jq

我经常在长命令中使用反引号,并用反斜杠换行符分隔以提高可读性。当我用语法替换反引号时$( ... ),出现错误。

例如,我使用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=
Run Code Online (Sandbox Code Playgroud)

这没有问题,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
Run Code Online (Sandbox Code Playgroud)

我从错误中不清楚,是否)实际上没有终止由其启动的命令$(,或者$( ... )反斜杠内部是否没有按照我的预期进行解释。

我希望能够使用该$( ... )语法,因为有时我想将一个子 shell 嵌套在另一个子 shell 中,而使用反引号很难做到这一点。

lar*_*sks 7

您当然可以在表达式\中使用转义行尾$(...)。另请注意,您不需要在单引号内的表达式\中使用这些。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
    '
)
Run Code Online (Sandbox Code Playgroud)

$DailyTasksListID我无法对此进行测试,因为我目前没有有用的价值,也没有能力对 trello 进行身份验证。