次のコードで改行文字を使用する方法(propertyVar内)
#!/bin/sh
#Shell script for running the script from Jenkins
#Performance Engineering Team
HealthPollingInterval=$1
ThinkTime=$2
XMLReport=$3
UserDataFile=$4
CdnUrl=$5
StreamingUrl=$6
TrThinkTime=$7
TrMinThinkTime=$8
TrMaxThinkTime=$9
AxThinkTime=$10
AxMinThinkTime=$11
AxMaxThinkTime=$12
triggerPerformanceTest(){
echo "checking the status of the health service"
HTTP_RESPONSE=$(curl -m 1800 --silent --write-out "HTTPSTATUS:%{http_code}" -X GET http://localhost/health)
HTTP_STATUS=$(echo $HTTP_RESPONSE | tr -d '\n' | sed -e 's/.*HTTPSTATUS://')
HTTP_BODY=$(echo $HTTP_RESPONSE | sed -e 's/HTTPSTATUS\:.*//g')
if [ $HTTP_STATUS -eq 200 ] && [ $HTTP_BODY = "OK" ]; then
propertyVar='{"HealthPollingInterval": '"$HealthPollingInterval"', "ThinkTime": '"$ThinkTime"', "XMLReport": '\""$XMLReport"\"',\r\n
"UserDataFile": '\""$UserDataFile"\"', "CdnUrl": '\""$CdnUrl"\"', "StreamingUrl": '\""$StreamingUrl"\"',
"TrThinkTime": '"$TrThinkTime"', "TrMinThinkTime": '"$TrMinThinkTime"', "TrMaxThinkTime": '"$TrMaxThinkTime"',
"AxThinkTime": '"$AxThinkTime"', "AxMinThinkTime": '"$AxMinThinkTime"', "AxMaxThinkTime": '"$AxMaxThinkTime"'}'
echo "$propertyVar"
#curl -X POST http://localhost/triggerExecutionwithParamater -H 'Content-Type: application/json' -d "$propertyVar"
else
echo "Need to start the service on the target machine"
fi
}
triggerPerformanceTest $HealthPollingInterval $ThinkTime $XMLReport $UserDataFile $CdnUrl $StreamingUrl $TrThinkTime $TrMinThinkTime $TrMaxThinkTime $AxThinkTime $AxMinThinkTime $AxMaxThinkTime
propertyVarには10〜15個の変数があり、それを1行に入れるとスクリプトが正しく機能します。しかし、私はそれらを順番に維持するために改行文字を使用したいと思います。これまで \, \n, "\n" , '\n', \r\n を使用していましたが、何も機能しません。
答え1
有効なJSONを生成する最も簡単な方法はjq
。
次のコードは、スクリプトの12のコマンドライン引数に基づいてJSON文書を生成し、次のコマンドを使用して文書を公開しますcurl
。
#!/bin/bash
if [ "$#" -ne 12 ]; then
printf 'Expected 12 arguments, got %d\n' "$#"
exit 1
fi >&2
args=( "$@" ) # Save the original arguments for later.
# Prepare arguments for "jq".
for param in \
HealthPollingInterval \
ThinkTime \
XMLReport \
UserDataFile \
CdnUrl \
StreamingUrl \
TrThinkTime \
TrMinThinkTime \
TrMaxThinkTime \
AxThinkTime \
AxMinThinkTime \
AxMaxThinkTime
do
set -- "$@" --arg "$param" "$1"
shift
done
# Create our JSON document and post it.
# Output an error message and terminate if the post fails.
if ! jq -nc "$@" '$ARGS.named' |
curl --silent --show-error --fail \
--json @- 'http://localhost/triggerExecutionwithParamater'
then
echo 'Failed to post JSON document.' >&2
exit 1
fi
# Call triggerPerformanceTest with the original arguments.
triggerPerformanceTest "${args[@]}"
これはループを使用して--arg key value
後で使用される一連のパラメータを生成しますjq
。このjq
呼び出しは、名前付きキーとその値を含むJSONオブジェクトを作成し、curl
APIエンドポイントにパイプして公開されます。
答え2
@Kusalanandaと同じです。perl
代わりに、以下を使用してください。jq
#! /bin/sh -
perl -CA -MJSON -le '
$object{$_} = shift @ARGV for qw(
HealthPollingInterval ThinkTime XMLReport
UserDataFile CdnUrl StreamingUrl
TrThinkTime TrMinThinkTime TrMaxThinkTime
AxThinkTime AxMinThinkTime AxMaxThinkTime
);
print encode_json(\%object)' -- "$@" |
curl --silent --show-error --fail \
--json @- 'http://localhost/triggerExecutionwithParamater'
答え3
欲しいかもしれませんフォーマットを維持するにはheredocを使用してください。、しかし置換を実行するには、Heredoc区切り文字を引用符で囲む必要があります。
したがって、あなたの場合、then ...と..elseの間のブロックは次のようになります。
read -r -d '' propertyVar <<EOF
{
"HealthPollingInterval": "$HealthPollingInterval", "ThinkTime": "$ThinkTime", "XMLReport": "$XMLReport"
"UserDataFile": "$UserDataFile", "CdnUrl": "$CdnUrl", "StreamingUrl": "$StreamingUrl",
"TrThinkTime": "$TrThinkTime", "TrMinThinkTime": "$TrMinThinkTime", "TrMaxThinkTime": "$TrMaxThinkTime",
"AxThinkTime": "$AxThinkTime", "AxMinThinkTime": "$AxMinThinkTime", "AxMaxThinkTime": "$AxMaxThinkTime"
}
EOF
echo "$propertyVar"
<<'EOF'
または を指定すると、<<"EOF"
区切られた文書内で変数置換が発生しません。