我有一個 shell 腳本,它接受 3 個引數,其中第一個和第二個是字串,第三個是用雙引號括起來的 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 的形式訪問第三個引數值?請幫我。
提前致謝
uj5u.com熱心網友回復:
Shell 不是這項作業的工具。蟒蛇等。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
最后的建議 - 不要這樣做。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/378754.html
上一篇:有沒有辦法在bash中計算排列?
