
我想使用httpie提交json資料。
如果我使用雙引號並轉義鍵周圍的雙引號,它就可以工作。
json="[ \
{ \
\"count\": 3 \
} \
]"
echo $json
[ {“計數”:3 }]
但我不想逃避。下面的複製貼上比較容易,但是不行。
json='[ \
{ \
"count": 3 \
} \
]'
echo $json
[ \ { \ 「計數」:3 \ } \ ]
那麼,是否有可能不轉義 json 鍵周圍的雙引號,從而更容易從某處複製並貼上?
答案1
在
var="foo\
bar"
雙引號內的序列\<newline>
是特殊的,但單引號內的序列不是特殊的,並且是已刪除,所以$var
包含foobar
.
當你在做的時候:
echo $json
您正在使用 split+glob 運算子(當您忘記引用擴充功能時呼叫的隱式運算子),也就是說, 的內容會$json
根據 中的字元進行拆分$IFS
,並且每個單字都會產生檔案名稱(也稱為globbing )。
預設值$IFS
包含空格製表符和換行符(空格、製表符和換行符也恰好在分割方面得到特殊處理,因為它們的任何序列都計數為 1,並且忽略前導和尾隨序列)。例如:
var=' foo *
bar'
echo $var
$var
首先分為foo
,*
和bar
(分裂部分)並*
擴展到目前目錄中的非隱藏檔案清單(全域部分)。
如果您想按原樣顯示內容(但請注意,許多echo
實作可能會破壞內容),您可以撰寫:
$ echo "$json"
[ { "count": 3 } ]
現在,如果您的目的是壓縮間距,也許您可以使用 split+glob 運算子來發揮您的優勢。
json='
[
{
"count": 3
}
]'
unset -v IFS # make sure we get a default splitting behaviour.
# an unset -v IFS is equivalent to IFS=$' \t\n'
set -o noglob # disable the glob part
echo $json # use the split+glob operator
echo
輸出以空格分隔的參數,因此每個空格、製表符或換行符序列實際上都會被單個空格字元替換(前導和尾隨字元除外,它們將被刪除,並echo
在最後添加一個換行符)。所以你會得到:
[ { "count": 3 } ]
在任何情況下,這都不會區分空格是否在引號內,因此它可能會改變 json 資料的含義(例如"foo bar"
將被轉換為)。"foo bar"
如果您想使用\<newline>
序列來轉義(刪除)換行符,但保留其他空白字符,而不必轉義雙引號字符,則可以使用此處文件:
json=$(cat <<EOF
[\
{\
"count": 3\
}\
]
EOF
)
echo "$json"
這會給出:
[ { "count": 3 } ]
(換行符已被刪除(您可以選擇保留其中一些換行符,而不是在它們前面添加反斜線),但其他空白字元保持不變)。
答案2
不需要反斜線來繼續引號內的行。在第二個範例中,反斜線是非常有害的,因為在單引號內它們將保持原樣,從而使字串在語法上無效。只要去掉反斜線就可以了。