CURL aracılığıyla github için gistub gönderiliyor ve dosya içinde yeni satırlar çıkıyor


1

Diyelim ki benim bir index.php bunu içeren dosya:

 <?= "Hello" ?>

 <?= echo "WORLD" ?>

Ve bu dosyanın içeriğini, üzerinden yaptığım github'taki adamlarıma yüklemek istedim.

gist_content=$(cat 'index.php')

curl --user "GITHUB_USER"  -H "Content-Type: application/json; charset=UTF-8" -X POST -d  "{ \"description\": \"Created via API\", \"public\": \"true\", \"files\":{ \"index.php \":{ \"content\": \"$gist_content\"}}\" " https://api.github.com/gists

Şimdi, bu komut dosyası nedense çalışmıyor ve hata yanıtı alıyorum

{
  "message": "Problems parsing JSON",
  "documentation_url": "https://developer.github.com/v3/gists/#create-a-gist"
}

Her şeyi etiketsiz tek bir satıra yazarsam, hello işe yarıyor

Yanıtlar:


1

JSON dizginizde bazı sözdizimi hatası var. Lütfen kontrol edip düzeltin. Örneğin.

$ echo "{ \"description\": \"Created via API\", \"public\": \"true\", \"files\":{ \"index.php \":{ \"content\": \"$gist_content\"}}\" " | python -m json.tool
Expecting ',' delimiter: line 1 column 95 (char 94)

Kıvrımlı parantezlerden birini kaçırıyorsunuz, 3'ü açıyorsunuz, ancak 2'yi kapatıyorsunuz.

Basitleştirilmiş sözdizimi şöyle olmalıdır:

$ echo '{"description": "Created via API", "public": "true", "files": { "index.php": { "content": "foo" } } }' | python -m json.tool
{
    "description": "Created via API",
    "files": {
        "index.php": {
            "content": "foo"
        }
    },
    "public": "true"
}

O zaman, alıntılardan kaçma meselesi, ama yanlış şekilde kaçıyorsun Tek alıntı dizeler içinde tek tırnak kaçış? Örneğin:

$ echo 'abc'\''abc'
abc'abc
$ echo "abc"\""abc"
abc"abc

İkili tırnak içeren harici bir dosyayı içe aktardığınızdan, bunları gibi araçlarla da iki kez alıntı yapmanız gerekir. sed, vb. Yeni satırlarda olduğu gibi, bunları uygun kontrol karakterlerine dönüştürmelisiniz (ya <br> veya \n ) beklenen formata bağlı olarak.

Son örneğiniz şöyle görünür:

gist_content=$(cat index.php | sed 's/"/\\"/g' | paste -s -d '\\n' -)
curl --user "GITHUB_USER" -H "Content-Type: application/json; charset=UTF-8" -X POST -d "{"\""description"\"": "\""Created via API"\"", "\""public"\"": "\""true"\"", "\""files"\"": { "\""index.php"\"": { "\""content"\"": "\""$gist_content"\"" } } }" https://api.github.com/gists

JSON isteğini tek tırnakla başlattıysam, o zaman $gist_content değerlendirilmeyecek.
samayo

Çift tırnak kullandığınızda kaçmanız gerekir, ancak kaçmanız doğru değildir. Gönderiyi güncelleyeyim, ancak bilgisayarım çok yavaş. Yapmanız gereken: " "\"" " tek bir çift alıntıdan kaçmak için. İkincisi, JSON'nuzda eşit olmayan parantezler veya bir şey var.
kenorb

Tek tırnak kullanırsam bash $ değişkeninin okunmayacağını söylüyorum. Deneyebilirsin, sonra senin için işe yararsa bana haber ver.
samayo

@ samayo Biliyorum, sadece JSON'unuzda sözdizimi hatası olduğunuzu söylüyorum, gerisini siz yapabilirsiniz. Size geçerli JSON formatının ne olduğunu göstermeniz için örneği basitleştirdim ve sorunun nerede olduğunu açıkladım, böylece sorunu anlayarak kendiniz düzeltebilirsiniz. Sadece bir yazım hatası var, hepsi bu.
kenorb

Dediğim gibi, son örneğiniz bana soruda da aynı hatayı veriyor. Bu zor bir durum.
samayo

1

Kullanabilirsiniz bu çözüm yeni satırları değiştirmek için content & Sons; description alan :

#!/bin/bash

ACCESS_TOKEN="YOUR_ACCESSS_TOKEN"

description="the description for this gist. There are also some quotes 'here' and \"here\" in that description"
public="true"
filename="index.php"

desc=$(echo "$description" | sed 's/"/\\"/g' | sed ':a;N;$!ba;s/\n/\\n/g')
json=$(cat index.php | sed 's/"/\\"/g' | sed ':a;N;$!ba;s/\n/\\n/g')

curl -v -H "Content-Type: text/json; charset=utf-8" \
        -H "Authorization: Token $ACCESS_TOKEN" \
        -X POST https://api.github.com/gists -d @- << EOF
{ 
  "description": "$desc", 
  "public": "$public", 
  "files": { 
      "$filename" : { 
          "content": "$json"
       } 
   } 
}
EOF
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.