Изменение значения переменной в оболочке скрипта с помощью команды sed; синтаксис ошибки

#sed #blockchain

#sed #блокчейн

Вопрос:

 sed -i 's|from_infura_hex=?|from_infura_hex=$(curl -s -X POST --connect-timeout 5 -H "Content-Type: application/json" --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' https://ropsten.infura.io/X/X | jq .result | xargs)|' /home/ec2-user/LastBlockNode.sh
 

Я пытался выполнить эту команду, но я всегда получаю эту ошибку:

-bash: синтаксическая ошибка рядом с неожиданным токеном `)’

Цель этой команды — изменить значение from_infura_hex=? в скрипте LastBlockNode.sh по команде curl.

Кто-нибудь может помочь с этой командой sed?

Ответ №1:

  • Если вы выберете символ канала | в качестве разделителя для s команды, символ не должен появляться в шаблоне или замене без экранирования. Поскольку вы используете | в своей команде конвейер, лучше выбрать другой символ, например # .
  • Вы не можете заключать одинарные кавычки, даже если вы экранируете их обратной косой чертой.
  • Чтобы использовать подстановку команды внутри замены, вам нужно сказать sed -i '/pattern/'"$(command)"'/' , нет sed -i '/pattern/$(command)/' .

Тогда, пожалуйста, попробуйте что-то вроде:

 sed -i 's#from_infura_hex=?#from_infura_hex='"$(curl -s -X POST --connect-timeout 5 -H "Content-Type: application/json" --data "{"jsonrpc":"2.0","method":
"eth_blockNumber","params":[],"id":1}" https://ropsten.infura.io/X/X | jq .result | xargs)"'#' /home/ec2-user/LastBlockNode.sh
 

Но будет безопаснее и удобнее разбить команду на
несколько строк:

 replacement="$(curl -s -X POST --connect-timeout 5 -H "Content-Type: application/json" --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' https://ropsten.infura.io/X/X | jq .result | xargs)"
sed -i 's#from_infura_hex=?#from_infura_hex='"$replacement"'#' /home/ec2-user/LastBlockNode.sh
 

Пожалуйста, обратите внимание, что я не тестировал приведенные выше команды с фактическими данными.
Если какой-либо из них по-прежнему не работает, пожалуйста, сообщите мне об этом с сообщением об ошибке.

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

1. Спасибо за ваш ответ, я попробовал два решения, которые вы мне даете, но в обоих из них замена переменной будет равна нулю, как показано ниже. Значение будет отображаться в файле следующим образом я пытался даже изменить некоторые цитаты, но мне это не удалось. from_infura_hex=null

2. Спасибо за отзыв. Это будет легче отлаживать со 2-м подходом. Сначала, пожалуйста, выполните echo "$replacement" , чтобы увидеть, что присвоено переменной. Если оно пустое, или null затем выполните команду между "$( и )" , что означает от curl до xargs . Пожалуйста, внимательно скопируйте и вставьте командную строку, не изменяя кавычки. Если на выходе все еще есть проблема, удалите конвейер | jq .result | xargs и проверьте вывод. Удачи.