Если я правильно понимаю ситуацию, у вас есть два массива, содержащих числа, что-то вроде:
array_1=(1 2 3)
array_2=(21 22 23)
... и вы хотите передать эти списки чисел в сценарий в виде разделенных пробелами списков, что-тонапример, запустить это на удаленном компьютере:
./script.sh -m 1G -s 0 -d 120 -w 60 -j 512M -k 512M -l 515M -b "1 2 3" -u "21 22 23"
Если это правильно, попробуйте следующую команду:
ssh -i location/to/keyfile -o StrictHostKeyChecking=no -T ubuntu@18.220.20.50 ./script.sh -m 1G -s 0 -d 120 -w 60 -j 512M -k 512M -l 515M -b "'${array_1[*]}'" -u "'${array_2[*]}'"
Объяснение: команды, переданные через ssh, анализируются дважды;сначала локальной оболочкой, а затем результат этого снова анализируется удаленной оболочкой.На каждом из этих этапов анализа кавычки (и экранирование) применяются и удаляются .Ваша исходная команда имела только один уровень кавычек, поэтому локальная оболочка анализирует, применяет и удаляет ее, поэтому удаленная оболочка не видит кавычек, поэтому она обрабатывает каждое из чисел как отдельную вещь.
Более подробно: исходная команда:
ssh -i location/to/keyfile -o StrictHostKeyChecking=no -T ubuntu@18.220.20.50 ./script.sh -m 1G -s 0 -d 120 -w 60 -j 512M -k 512M -l 515M -b "${array_1[*]}" -u "${array_2[*]}"
имеет расширенные ссылки на массивы, что дает эквивалент (при условии, что содержимое массива я перечислил выше):
ssh -i location/to/keyfile -o StrictHostKeyChecking=no -T ubuntu@18.220.20.50 ./script.sh -m 1G -s 0 -d 120 -w 60 -j 512M -k 512M -l 515M -b "1 2 3" -u "21 22 23"
Локальная оболочкаанализирует и удаляет кавычки, но они передают 1 2 3
и 21 22 23
программам ssh
как один аргумент.Но затем ssh
просто вставляет список аргументов команды, которые он получил, вместе с пробелами между ними, так что это то, что он отправляет в удаленную оболочку:
./script.sh -m 1G -s 0 -d 120 -w 60 -j 512M -k 512M -l 515M -b 1 2 3 -u 21 22 23
..., что сбивает с толку сценарий.
Мое решение, добавляя одинарные кавычки вокруг ссылок на массивы, не изменяет локальный синтаксический анализ (одинарные кавычки находятся внутри двойных кавычек, поэтому они не имеют специального эффекта);они просто пропускаются, в результате чего эта команда отправляется в удаленную оболочку:
./script.sh -m 1G -s 0 -d 120 -w 60 -j 512M -k 512M -l 515M -b '1 2 3' -u '21 22 23'
Одиночные кавычки здесь имеют тот же эффект, что и двойные кавычки (так как других кавычек нет, экранирование выполняется,знаки доллара или другие специальные символы внутри них), поэтому это должно дать желаемый результат.