Вопрос или проблема
Я довольно нов в bash.
Я хочу вызвать скрипт, расположенный на удаленной машине с Linux, передавая некоторые обычные аргументы и один массив. Массив содержит строковые элементы, которые могут содержать пробелы.
Я написал минимальный пример:
на стороне сервера: copyFiles.sh
#!/bin/bash
msg=$1
msg2=$2
shift
shift
arr=("$@") # Перестраиваем массив с остальными аргументами
for ((i = 0; i < ${#arr[@]}; i++))
do
echo $msg $msg2 "${arr[$i]}"
done
На стороне хоста:
first="first"
second="second"
array=("arra y1" "array2" "array3")
plink -ssh username@hostname -pw mypwd -batch " bash scripts/copyFiles.sh $first $second "${array[@]}" "
Вывод:
first second arra
first second y1
first second array2
first second array3
Что я хочу:
first second arra y1
first second array2
first second array3
Спасибо
Я думаю, вам просто нужно использовать \"
для аргументов с пробелами.
Вы пробовали экранировать строку с пробелами следующим образом:
“\”arra y1\””
Я думаю, это может решить вашу проблему.
Ответ или решение
Для того чтобы передать массив строк с пробелами в качестве аргумента для bash-скрипта на удалённой машине, нужно правильно экранировать строки с пробелами при формировании команды. Ваша текущая попытка не сохраняет пробелы в элементах массива, потому что они интерпретируются как отдельные аргументы.
Вот подробное решение, использующее экранирование:
Серверная часть (copyFiles.sh):
Ваша серверная часть скрипта корректна и не требует изменений:
#!/bin/bash
msg=$1
msg2=$2
shift
shift
arr=("$@") # Восстановление массива с остальными аргументами
for ((i = 0; i < ${#arr[@]}; i++))
do
echo "$msg" "$msg2" "${arr[$i]}"
done
Клиентская часть:
Чтобы корректно передать массив строк с пробелами, вам нужно использовать квадратные скобки с кавычками. Вот ваш исправленный код:
first="first"
second="second"
array=("arra y1" "array2" "array3")
# Преобразуем элементы массива в строки, заключённые в кавычки
quoted_array=()
for element in "${array[@]}"; do
quoted_array+=("\"$element\"") # Экранируем пробелы
done
# Присоединяем элементы массива в одну строку
quoted_array_string="${quoted_array[*]}"
# Передаём аргументы через plink с правильным экранированием
plink -ssh username@hostname -pw mypwd -batch "bash scripts/copyFiles.sh \"$first\" \"$second\" $quoted_array_string"
Ожидаемый вывод:
После внесения вышеприведённых изменений, вывод будет следующим:
first second arra y1
first second array2
first second array3
Объяснение:
-
Экранирование: Мы используем
\"$element\"
, чтобы каждый элемент массива в строке был заключён в кавычки, что позволяет сохранить пробелы при передаче. - Объединение строк: Все элементы массива конкатенируются в одну строку через
"${quoted_array[*]}"
.
Такое решение должно полностью удовлетворить ваши требования и позволить передавать элементы массива с пробелами без потери информации.