Это действительно возможно. Вы можете сделать что-то вроде этого:
nohup sh -c "printf 'foo\nbar\n' | myScript.sh"
Это будет передавать foo
и bar
в качестве входных данных.
Но не делайте этого. Только не используйте read
. На самом деле, я даже не могу придумать какой-либо веской причины для когда-либо использования read
внутри скрипта. Я уверен, что есть некоторые крайние случаи, когда это необходимо, но вы должны избегать этого, когда это возможно. Заставлять пользователей вводить данные обременительно, подвержено ошибкам и делает невозможным автоматизацию вашего сценария.
Так что просто измените свой скрипт, чтобы он читал данные из командной строки:
#!/bin/sh
info1="$1"
info2="$2"
echo "$info1 $info2">>log.txt
Затем запустите скрипт с любыми параметрами, которые вы хотите:
myScript.sh foo bar
или
myScript.sh 'this one has spaces!' bar
Предполагая, что ваш документ JSON правильно сформирован, что не соответствует показанному вами примеру, поскольку он содержит несколько проблем:
$ cat file
{
"root": {
"instances": [
{
"name": "1",
"configs": [
{
"keyname": "foo",
"value": ""
},
{
"keyname": "barrr",
"value": "barrrr"
}
]
},
{
"name": "2",
"configs": [
{
"keyname": "foo",
"value": ""
},
{
"keyname": "buzzz",
"value": "buzzz"
}
]
}
]
}
}
$ jq '(.root.instances[].configs[] | select(.keyname == "foo") ).value |= "foo"' file
{
"root": {
"instances": [
{
"name": "1",
"configs": [
{
"keyname": "foo",
"value": "foo"
},
{
"keyname": "barrr",
"value": "barrrr"
}
]
},
{
"name": "2",
"configs": [
{
"keyname": "foo",
"value": "foo"
},
{
"keyname": "buzzz",
"value": "buzzz"
}
]
}
]
}
}
Это выражение jq
обновляет значение ключа .value
до строки foo
. Обновляемый ключ выбирается из одной из записей в .root.instances[].configs[]
. Обратите внимание, что .root.instances
— это массив, и каждая запись .configs
в каждом из его элементов также является массивом. Оператор select()
проверяет ключ .keyname
строкой foo
.
Создание ключа запроса и переменной нового значения выполняется следующим образом:
jq --arg querykey 'foo' \
--arg newval 'The train said "choo choo"' \
'(.root.instances[].configs[] | select(.keyname == $querykey) ).value |= $newval' file
Это создает две внутренние jq
переменные с именами $querykey
и $newval
. Их значения будут правильно закодированы, так что, например. $newval
может содержать двойные кавычки, как показано выше.