Просто чтобы закрыть этот вопрос, и, как советуют в комментариях, причина, по которой ваш массив выглядит «разделенным», заключается в том, как вы печатаете свой массив, а не в том, что ваш массив разделен чтением.
Если вы сомневаетесь в том, что на самом деле содержит ваш массив, я бы предложил использовать либо declare -p
(-p для печати), либо printf
с использованием двойных кавычек.
На самом деле вы всегда должны дважды цитировать свои переменные, независимо от того, печатаете ли вы их или просто используете их в своих скриптах.
См. следующие тесты:
$ a="/media/root/persistence/file
/media/root/persistence/anotherfile
/media/root/persistence/(copy) file"
$ echo "$a"
/media/root/persistence/file
/media/root/persistence/anotherfile
/media/root/persistence/(copy) file
$ echo $a
/media/root/persistence/file /media/root/persistence/anotherfile /media/root/persistence/(copy) file
$ readarray -t y <<<"$a"
$ declare -p y
declare -a y=([0]="/media/root/persistence/file" [1]="/media/root/persistence/anotherfile" [2]="/media/root/persistence/(copy) file")
$ printf '%s\n' ${y[@]}
/media/root/persistence/file
/media/root/persistence/anotherfile
/media/root/persistence/(copy)
file
$ printf '%s\n' "${y[@]}"
/media/root/persistence/file
/media/root/persistence/anotherfile
/media/root/persistence/(copy) file
Как упоминалось don_crissti, вы получили такое поведение, потому что не сделали двойную кавычку своей переменной.
Чтобы немного подчеркнуть важность постоянного цитирования переменных, см. этот дополнительный тест:
$ b=" "
$ [ $b = " " ] && echo "ok" || echo "not ok"
bash: [: =: unary operator expected
not ok
$ [ "$b" = " " ] && echo "ok" || echo "not ok"
ok
Начните с рефакторинга кода.
bearer="Bearer \"$(printf user:pass | base64)\""
curl -X POST --header "$bearer" 'https://api.com/v1/auth'
Теперь, когда вы переходите к отладке, вам не нужно снова заключать в кавычки аргумент (s ).
echo curl -X POST --header "$bearer" 'https://api.com/v1/auth'