Как выполнить подстановку строк для построения строки json в zsh?

#zsh

#зш

Вопрос:

Это моя функция

 function print_doc_json() {
    docId=$1
    echo '{ ":d": { "S": "$(docId)" }}'
}
 

Я хочу, чтобы результат print_doc_json abc123 был { ":d": { "S": "abc123" }}

Однако это получилось как { ":d": { "S": "$(docId)" }} . Он DocId не заменяется.

Как я могу получить замену строки в строке, уже заключенной в пару кавычек?

Комментарии:

1. Если у вас есть jq в наличии (и я рекомендую использовать его), используйте jq -n --arg d "$docId" '{":d": {S: $d}}' вместо echo .

Ответ №1:

Есть две ошибки. Во-первых, подстановка переменных выполняется следующим образом: ${docId} , а не так: $(docId)

Во-вторых, если вы заключаете строку в одинарные кавычки ( ' ), подстановка переменных внутри не выполняется — вы должны использовать двойные кавычки ( " ) . Имейте в виду, что в этом случае вы должны экранировать двойные кавычки, которые вы хотите напечатать:

 function print_doc_json() {
    docId=$1
    echo "{ ":d": { "S": "${docId}" }}"
}
 

В качестве альтернативы вы можете использовать одинарные кавычки снаружи, но тогда вы также должны выполнить подстановку снаружи:

 function print_doc_json() {
    docId=$1
    echo '{ ":d": { "S": "'${docId}'" }}'
}
 

Это три объединенные строки: '{ ":d": { "S": "' , ${docId} и '" }}' .

Комментарии:

1. Это хрупкое, предполагающее, что docId оно не содержит пробелов, двойных кавычек или других символов, нуждающихся в экранировании.