Por que não var=abc; ./test.sh "$var" "$var"
?
Ou, chame seu script com um argumento e o script manipulará o valor ausente:
#!/bin/bash
fieldValue1=$1
fieldValue2=${2:-$1}
...
depois: ./test.sh foo
outputs {"field1"="foo", "field2"="foo"}
Note que não é JSON: use dois pontos não iguais: {"field1":"foo", "field2":"foo"}
Você também está deixando as variáveis sem aspas quando atribui a variável jsonString. Faça isso
jsonString='{"field1":"'"$fieldValue1"'", "field2":"'"$fieldValue2"'"}'
# ......................^............^...............^............^
# or
jsonString="{'field1':'$fieldValue1', 'field2':'$fieldValue2'}"
# or
printf -v jsonString '{"field1":"%s","field2":"%s"}' "$fieldValue1" "$fieldValue2"
Além disso, você deve proteger contra os valores que contêm caracteres de aspas:
printf -v jsonString '{"field1":"%s","field2":"%s"}' \
"${fieldValue1//\"/\\"}" \
"${fieldValue2//\"/\\"}"
Então
$ ./test.sh 'he said "foo"'
{"field1":"he said \"foo\"","field2":"he said \"foo\""}
Com base nos requisitos atualizados. Atribuir a variável deve ser uma etapa separada. Você também está sentindo falta da sintaxe de substituição de comando%
Primeiro, um script atualizado:
#!/bin/bash
pairs=()
for ((i=1; i<=$#; i++)); do
value=${!i}
pairs+=( "$(printf '"%s":"%s"' "field$i" "${value//\"/\\"}")" )
done
IFS=,
echo "{${pairs[*]}}"
Em seguida, invoque-o assim
startDate=1/1/2020
bash test.sh "$startDate" someOtherValue "$startDate" "$(date -u -d "$startDate 1 hour" "+%FT%TZ")" "anotherValue"
e obtenha esta saída:
{"field1":"1/1/2020","field2":"someOtherValue","field3":"1/1/2020","field4":"2020-01-01T01:00:00Z","field5":"anotherValue"}