Bash: сценарий оболочки с командой `read` и def (s), заключенными в << - EOF - PullRequest
0 голосов
/ 18 октября 2019

У меня есть вопрос о том, как предоставить переменную, заключенную в '"..."', ожидаемый формат для значения, считываемого сценарием оболочки с использованием read -d '' var <<- EOF.

Обзор

Я хочу использовать эту jq служебную библиотеку: jq-hopkok . В частности, сценарий оболочки bash to-components.sh , который использует jq для анализа URL-адресов в своих компонентах.

Этот сценарий великолепен, за исключением того, что мне не понятно, какиспользуйте этот скрипт, передав ему переменную $URL. Похоже, я могу передать этот сценарий только со статической строкой URL, которая должна быть заключена в двойные кавычки , а затем снова заключена в одинарные кавычки , например, '"..."'.

Пример вызова to-components.sh со статическим значением URL '"https://..."'

From README.md :

#!/usr/bin/env bash
# URL to components
echo '"https://server.example.com/deep/path/file.ext?with-a-parameter=true#and-a-fragment"' | ./to-components.sh

Пример частичного результата

{
  "value": "https://server.example.com/deep/path/file.ext?with-a-parameter=true#and-a-fragment",
  "valid": true,
  "scheme": {
    "value": "https",
    "valid": true
  },

Чтение строки URL в to-components.sh

Сценарий оболочки to-components.sh читает эту строку URL со специальными кавычками , которая должна быть обернута '"..."', иначе не удастся разобрать на компоненты:

#!/usr/bin/env bash
set -e

# Split up a URL string to an object with the URL components.
read -d '' toComponents <<-'EOF' || true
...
EOF

cat | jq "$toComponents"

Желаемая цель

Я быЯ хотел бы вызвать этот сценарий оболочки со строкой URL с переменной, например, я не уверен, как структурировать переменную ???${URL}???, чтобы ее можно было проанализировать с помощью сценария оболочки:

#!/usr/bin/env bash
URL="https://server.example.com/deep/path/file.ext?with-a-parameter=true#and-a-fragment"

# URL to components
echo ???${URL}??? | ./jq-hopkok/src/url/to-components.sh

Я перепробовал много подходов, но ни один из них не работает. Все в результате с ошибкой: parse error: Invalid numeric literal ...

Спасибо

Любые предложения очень ценятся!

1 Ответ

1 голос
/ 18 октября 2019

Вам нужно выводить буквальные двойные кавычки до и после $URL. Способ написать это ясно - создать переменную, которая содержит двойные кавычки.

URL="https://server.example.com/deep/path/file.ext?with-a-parameter=true#and-a-fragment"
dq='"'
echo "$dq$URL$dq" | ./jq-hopkok/src/url/to-components.sh
...