У меня есть такой файл:
1234 1234 "First Name" "Last Name"
И у меня есть такая функция bash:
function somePeoples()
{
body='"id":"'$1'","num":"'$2'","name":"'$3'","lname":"'$4'"'
echo $body
}
, которая содержится в сценарии bash, который я бы использовал вкомандная строка.После этого я делаю следующее для проверки функции:
$ arr=(1234 1234 "First Name" "Last Name")
$ somePeoples "{arr[@]}"
$ "id":"1234","num":"1234","name":"First Name","lname":"Last Name"
$ somePeoples "${arr[0]}" "${arr[1]}" "${arr[2]}" "${arr[3]}"
$ "id":"1234","num":"1234","name":"First Name","lname":"Last Name"
Теперь давайте вернемся к файлу, который содержит такие строки:
input.txt:
1234 1234 "First Name" "Last Name"
2234 2234 "Some other name" "Some other last name"
Я пытаюсь прочитать каждую строку вфайл через цикл for с ограниченным количеством, потому что я точно знаю, сколько строк в файле.Хитрость заключается в том, чтобы прочитать каждую строку и поместить каждую строку в массив для передачи в функцию somePeoples.Поэтому я делаю скрипт, который использует другой скрипт для этой функции.Давайте просто назовем его клиентским скриптом и притворимся, что он на самом деле зацикливается:
the client script:
arr=(`sed -n "1p" input.txt`)
somePeoples "${arr[@]}"
Но, к моему ужасу, получается:
$ "id":"1234","num":"1234","name":""First,"lname":"Name""
Кроме того, попытка сделать то же самоерезультат
somePeoples "${arr[0]}" "${arr[1]}" "${arr[2]}" "${arr[3]}"
somePeoples `sed -n "1p" input.txt`
Какая разница?Когда я набираю его в командной строке с теми же шаблонами цитирования, он работает нормально, но не тогда, когда я читаю входные данные из файла и передаю их в некоторый массив или непосредственно в функцию.Почему он разбивается на пробелы, хотя аргументы цитируются?И, да, как я могу предотвратить это?
На самом деле я пытаюсь подготовить тело запроса для передачи в cURL в формате jSON, а входные параметры содержатся в файле длиной в сотни строк.Но я думаю, что материал cURL не имеет отношения к этому вопросу, так как я воспроизвел проблему только через bash.