簡體   English   中英

Shell 腳本:讀取 JSON 字符串輸入參數

[英]Shell Script : Read JSON String Input Param

我有一個 shell 腳本,它接受 3 個 arguments ,其中第一個和第二個是字符串,第三個是 JSON 括在雙引號內。 下面是 shell 腳本和 args 示例的片段:

文件 readinp.sh

param1=$1
param2=$2
param3=$3

echo "Param1 is $param1"

echo "Param2 is $param2"

echo "Param3 is $param3"

腳本執行:

./readinp.sh hello world "[{'ParamName':'HostName','ParamVal':'Host1'},{'ParamName':'TargetMachine','ParamVal':'Machine1'}]"

如何在我的 shell 腳本中訪問第三個參數值作為 JSON? 請幫我。

提前致謝

Shell 不是這項工作的工具。 Python 等。 al.,更適合這項任務。 要運行它,您確實需要相信沒有人會將惡意代碼放入您的輸入中。 我不會在生產中運行這段代碼,因為我已經編寫了它,因為它的安全性很粗略而且很脆弱,這意味着您仍然需要提前知道變量將被命名為什么。 此時,您不妨在單獨的腳本中對 json 輸入進行預處理,並將您想要的值傳遞到腳本中。 請注意, jq需要有效的 json 因此您的報價必須顛倒。

#!/bin/sh
#
#
me="$( basename "${0}" )"

tmp="$( mktemp "${me}.XXXXXXXX" )" || exit 1
trap "rm -f -- '${tmp}'" EXIT
    
echo "$3" | jq -j '.[]|(.ParamName, "=\"", .ParamVal, "\"\n")' > "${tmp}"

. "${tmp}"

echo "\$1: $1"
echo "\$2: $2"
echo "\$3: $3"
echo "\$HostName: $HostName"
echo "\$TargetMachine: $TargetMachine"

回報:

$ ./readinp.sh hello world '[{"ParamName":"HostName","ParamVal":"Host1"},{"ParamName":"TargetMachine","ParamVal":"Machine1"}]'
$1: hello
$2: world
$3: [{"ParamName":"HostName","ParamVal":"Host1"},{"ParamName":"TargetMachine","ParamVal":"Machine1"}]
$HostName: Host1
$TargetMachine: Machine1

預處理稍微好一點,但仍然很脆。 我可能會在我在辦公桌邊工作的一個瑣碎的科學項目中使用它,比如一個家庭作業問題,其中代碼不會被評分,但不會在生產中:

$ cat ./preinp.sh                    
#!/bin/sh

echo "'${1}'" "'${2}'"
echo "${3}" | jq '.[]|(.ParamVal)'

和:

$ cat ./readinp.sh                    
#!/bin/sh

p1="$1"
p2="$2"
HostName="$3"
TargetMachine="$4"

echo "\$p1: $p1"
echo "\$p2: $p2"
echo "\$HostName: $HostName"
echo "\$TargetMachine: $TargetMachine"

結果是:

$ ./preinp.sh 'single-word' 'with a space' '[{"ParamName":"HostName","ParamVal":"Host1"},{"ParamName":"TargetMachine","ParamVal":"Machine1"}]' | xargs ./readinp.sh
$p1: single-word
$p2: with a space
$HostName: Host1
$TargetMachine: Machine1

最后的建議 - 不要這樣做。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM