Я не думаю, что сгенерированная строка - это то, что вы думаете.
Ваш код прекрасно работает для меня, если я просто вызываю его напрямую. С добавленным эхом, чтобы проверить, что значения хранятся в нужном месте:
$ ./child.sh --opt1='v1 v2' --opt2='v3 v4'
OPT1='v1 v2'
OPT2='v3 v4'
Вы должны быть в состоянии подтвердить это. Ваша проблема не в том, чтобы заставить дочерний скрипт принимать такие аргументы, а в том, чтобы родительский скрипт вызывал его правильно.
И, кстати, вы не на самом деле хотите запустить что-то вроде этого:
./childscript.sh "--opt1=value1 --opt2=value2"
Это приведет к тому, что вся строка (--opt1=value1 --opt2=value2
) будет прочитана как один аргумент. Я подозреваю, что вы не рассказали нам полную историю о том, как родительский сценарий вызывает это. Если вы покажете нам эти подробности, мы, вероятно, сможем помочь больше - или, может быть, этого достаточно для намека.