Saya memiliki file bash:
#!/bin/bash
# yesnobox.sh - An inputbox demon shell script
OUTPUT="/tmp/input.txt"
# create empty file
>$OUTPUT
# cleanup - add a trap that will remove $OUTPUT
# if any of the signals - SIGHUP SIGINT SIGTERM it received.
trap "rm $OUTPUT; exit" SIGHUP SIGINT SIGTERM
# show an inputbox
dialog --title "Inputbox" \
--backtitle "Search vacancies" \
--inputbox "Enter your query " 8 60 2>$OUTPUT
# get respose
respose=$?
# get data stored in $OUPUT using input redirection
name=$(<$OUTPUT)
curl -d '{"query":"developer", "turnOff":true}' -H "Content-Type: application/json" -X POST http://localhost:8080/explorer
dalam string terakhir (perintah curl) saya ingin mengatur variabel nama sebagai gantinya "developer". Bagaimana cara memasukkannya dengan benar?
Untuk mengakses variabel, Anda harus meletakkan tanda dolar di depan nama: $name
Namun, variabel tidak dapat diperluas di dalam string yang diapit oleh 'tanda kutip tunggal'. Anda harus membungkusnya di dalam "tanda kutip ganda &" meskipun, untuk mencegah pemisahan kata dari nilai yang diperluas, jika mungkin mengandung spasi.
Jadi pada dasarnya ada dua cara, kita bisa meletakkan seluruh argumen dalam tanda kutip ganda untuk membuat variabel dapat diperluas, tetapi kemudian kita harus melepaskan diri dari karakter tanda kutip ganda di dalamnya, sehingga mereka berakhir di parameter yang sebenarnya (baris perintah disingkat):
curl -d "{\"query\":\"$name\", \"turnOff\":true}" ...
Sebagai alternatif, kita dapat menggabungkan literal string yang diapit oleh tipe kutipan yang berbeda dengan menuliskannya langsung di samping satu sama lain:
curl -d '{"query":"'"$name"'", \"turnOff\":true}' ...
Karena nilai untuk parameter ikal -d
berada di dalam tanda kutip tunggal berarti tidak akan ada perluasan parameter, hanya dengan menambahkan variabel tidak akan bekerja. Anda dapat menyiasatinya dengan mengakhiri string literal, menambahkan variabel dan kemudian memulai string literal lagi:
curl -d '{"query":"'"$name"'", "turnOff":true}' -H "Content-Type: application/json" -X POST http://localhost:8080/explorer
Tanda kutip ganda tanda kutip ganda tambahan di sekitar variabel digunakan untuk mencegah ekspansi parameter shell yang tidak diinginkan.
Jawaban @ByteCommander'bagus, dengan asumsi Anda tahu bahwa nilai nama
adalah string JSON literal yang dieskeskusi dengan benar. Jika anda tidak bisa (atau tidak mau) membuat asumsi itu, gunakan alat seperti jq
untuk menghasilkan JSON untuk anda.
curl -d "$(jq -n --arg n "$name" '{query: $n, turnOff: true}')" \
-H "Content-Type: application/json" -X POST http://localhost:8080/explorer